diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.classpath b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.classpath
new file mode 100644
index 0000000..ad32c83
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.gitignore b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.gitignore
new file mode 100644
index 0000000..7447f89
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.gitignore
@@ -0,0 +1 @@
+/bin
\ No newline at end of file
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.options b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.options
new file mode 100644
index 0000000..dcf7c2b
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.options
@@ -0,0 +1,7 @@
+# Tracing options for the org.eclipse.gmf.tooling.examples.linklf.diagram plug-in
+
+# Common issues
+org.eclipse.gmf.tooling.examples.linklf.diagram/debug=false
+
+# Visual IDs
+org.eclipse.gmf.tooling.examples.linklf.diagram/debug/visualID=false
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.project b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.project
new file mode 100644
index 0000000..c23c0dd
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.gmf.tooling.examples.linklf.diagram</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.settings/org.eclipse.jdt.core.prefs b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..5926cc7
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,291 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=1
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=200
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.settings/org.eclipse.jdt.ui.prefs b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..42e882e
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+formatter_profile=_GMF Formatter Profile New
+formatter_settings_version=12
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/META-INF/MANIFEST.MF b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6d6d8fd
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/META-INF/MANIFEST.MF
@@ -0,0 +1,39 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.gmf.tooling.examples.linklf.diagram; singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts,
+ org.eclipse.gmf.tooling.examples.linklf.diagram.part,
+ org.eclipse.gmf.tooling.examples.linklf.diagram.providers
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.core.expressions,
+ org.eclipse.jface,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.views,
+ org.eclipse.ui.navigator,
+ org.eclipse.ui.navigator.resources,
+ org.eclipse.emf.ecore,
+ org.eclipse.emf.ecore.xmi,
+ org.eclipse.emf.edit.ui,
+ org.eclipse.gmf.runtime.emf.core,
+ org.eclipse.gmf.runtime.emf.commands.core,
+ org.eclipse.gmf.runtime.emf.ui.properties,
+ org.eclipse.gmf.runtime.diagram.ui,
+ org.eclipse.gmf.runtime.diagram.ui.properties,
+ org.eclipse.gmf.runtime.diagram.ui.providers,
+ org.eclipse.gmf.runtime.diagram.ui.providers.ide,
+ org.eclipse.gmf.runtime.diagram.ui.render,
+ org.eclipse.gmf.runtime.diagram.ui.resources.editor,
+ org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide,
+ org.eclipse.gmf.tooling.runtime;visibility:=reexport,
+ org.eclipse.gmf.tooling.examples.linklf;visibility:=reexport,
+ org.eclipse.gmf.tooling.examples.linklf.edit;visibility:=reexport,
+ org.eclipse.gef;visibility:=reexport
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/about.html b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/build.properties b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/build.properties
new file mode 100644
index 0000000..162d13a
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/build.properties
@@ -0,0 +1,10 @@
+bin.includes = .,\
+               icons/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               messages.properties,\
+               .options
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/incomingLinksNavigatorGroup.gif b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/incomingLinksNavigatorGroup.gif
new file mode 100644
index 0000000..fca9c53
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/incomingLinksNavigatorGroup.gif
Binary files differ
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/linkSourceNavigatorGroup.gif b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/linkSourceNavigatorGroup.gif
new file mode 100644
index 0000000..fca9c53
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/linkSourceNavigatorGroup.gif
Binary files differ
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/linkTargetNavigatorGroup.gif b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/linkTargetNavigatorGroup.gif
new file mode 100644
index 0000000..fca9c53
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/linkTargetNavigatorGroup.gif
Binary files differ
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/linksNavigatorGroup.gif b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/linksNavigatorGroup.gif
new file mode 100644
index 0000000..fca9c53
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/linksNavigatorGroup.gif
Binary files differ
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/obj16/LinklfDiagramFile.gif b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/obj16/LinklfDiagramFile.gif
new file mode 100644
index 0000000..4fc23ec
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/obj16/LinklfDiagramFile.gif
Binary files differ
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/outgoingLinksNavigatorGroup.gif b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/outgoingLinksNavigatorGroup.gif
new file mode 100644
index 0000000..fca9c53
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/outgoingLinksNavigatorGroup.gif
Binary files differ
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/wizban/NewLinklfWizard.gif b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/wizban/NewLinklfWizard.gif
new file mode 100644
index 0000000..7107df3
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/icons/wizban/NewLinklfWizard.gif
Binary files differ
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/messages.properties b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/messages.properties
new file mode 100644
index 0000000..50cf3ec
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/messages.properties
@@ -0,0 +1,88 @@
+
+# TODO: manually put keys and values
+LinklfCreationWizardTitle=New Links Look&Feel Diagram
+LinklfCreationWizard_DiagramModelFilePageTitle=Create Links Look&Feel Diagram
+LinklfCreationWizard_DiagramModelFilePageDescription=Select file that will contain diagram model.
+LinklfCreationWizard_DomainModelFilePageTitle=Create Links Look&Feel Domain Model
+LinklfCreationWizard_DomainModelFilePageDescription=Select file that will contain domain model.
+LinklfCreationWizardOpenEditorError=Error opening diagram editor
+LinklfCreationWizardCreationError=Creation Problems
+LinklfCreationWizardPageExtensionError=File name should have {0} extension.
+LinklfDiagramEditorUtil_OpenModelResourceErrorDialogTitle=Error
+LinklfDiagramEditorUtil_OpenModelResourceErrorDialogMessage=Failed to load model file {0}
+LinklfDiagramEditorUtil_CreateDiagramProgressTask=Creating diagram and model files
+LinklfDiagramEditorUtil_CreateDiagramCommandLabel=Creating diagram and model
+LinklfDocumentProvider_isModifiable=Updating cache failed
+LinklfDocumentProvider_handleElementContentChanged=Failed to refresh hierarchy for changed resource
+LinklfDocumentProvider_IncorrectInputError=Incorrect element used: {0} instead of {1} or {2}
+LinklfDocumentProvider_NoDiagramInResourceError=Diagram is not present in resource
+LinklfDocumentProvider_DiagramLoadingError=Error loading diagram
+LinklfDocumentProvider_UnsynchronizedFileSaveError=The file has been changed on the file system
+LinklfDocumentProvider_SaveDiagramTask=Saving diagram
+LinklfDocumentProvider_SaveNextResourceTask=Saving {0}
+LinklfDocumentProvider_SaveAsOperation=Saving {0} diagram as
+InitDiagramFile_ResourceErrorDialogTitle=Error
+InitDiagramFile_ResourceErrorDialogMessage=Model file loading failed
+InitDiagramFile_WizardTitle=Initialize new {0} diagram file
+InitDiagramFile_OpenModelFileDialogTitle=Select domain model
+LinklfNewDiagramFileWizard_CreationPageName=Initialize new diagram file
+LinklfNewDiagramFileWizard_CreationPageTitle=Diagram file
+LinklfNewDiagramFileWizard_CreationPageDescription=Create new diagram based on {0} model content
+LinklfNewDiagramFileWizard_RootSelectionPageName=Select diagram root element
+LinklfNewDiagramFileWizard_RootSelectionPageTitle=Diagram root element
+LinklfNewDiagramFileWizard_RootSelectionPageDescription=Select semantic model element to be depicted on diagram
+"Select diagram root element:"
+LinklfNewDiagramFileWizard_RootSelectionPageSelectionTitle=Select diagram root element:
+LinklfNewDiagramFileWizard_RootSelectionPageNoSelectionMessage=Diagram root element is not selected
+LinklfNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage=Invalid diagram root element is selected
+LinklfNewDiagramFileWizard_InitDiagramCommand=Initializing diagram contents
+LinklfNewDiagramFileWizard_IncorrectRootError=Incorrect model object stored as a root resource object
+LinklfDiagramEditor_SavingDeletedFile=The original file "{0}" has been deleted.
+LinklfDiagramEditor_SaveAsErrorTitle=Problem During Save As...
+LinklfDiagramEditor_SaveAsErrorMessage=Save could not be completed. Target file is already open in another editor.
+LinklfDiagramEditor_SaveErrorTitle=Save Problems
+LinklfDiagramEditor_SaveErrorMessage=Could not save file.
+LinklfElementChooserDialog_SelectModelElementTitle=Select model element
+ModelElementSelectionPageMessage=Select model element:
+ValidateActionMessage=Validate
+Linklf1Group_title=Elements
+Container1CreationTool_title=Container
+Container1CreationTool_desc=Create new Container
+Rectangle2CreationTool_title=Rectangle
+Rectangle2CreationTool_desc=Create new Rectangle
+Circle3CreationTool_title=Circle
+Circle3CreationTool_desc=Create new Circle
+Rhombus4CreationTool_title=Rhombus
+Rhombus4CreationTool_desc=Create new Rhombus
+Link5CreationTool_title=Link
+Link5CreationTool_desc=Create new Link
+LabeledLink6CreationTool_title=LabeledLink
+LabeledLink6CreationTool_desc=Create new LabeledLink
+Port7CreationTool_title=Port
+Port7CreationTool_desc=Create new Port
+ContainerContainerCompartmentEditPart_title=ContainerCompartment
+ContainerContainerCompartment2EditPart_title=ContainerCompartment
+CommandName_OpenDiagram=Open Diagram
+NavigatorGroupName_Canvas_1000_links=links
+NavigatorGroupName_Circle_2001_incominglinks=incoming links
+NavigatorGroupName_Circle_2001_outgoinglinks=outgoing links
+NavigatorGroupName_Rectangle_2002_incominglinks=incoming links
+NavigatorGroupName_Rectangle_2002_outgoinglinks=outgoing links
+NavigatorGroupName_Rhombus_2004_incominglinks=incoming links
+NavigatorGroupName_Rhombus_2004_outgoinglinks=outgoing links
+NavigatorGroupName_Circle_3001_incominglinks=incoming links
+NavigatorGroupName_Circle_3001_outgoinglinks=outgoing links
+NavigatorGroupName_Rectangle_3003_incominglinks=incoming links
+NavigatorGroupName_Rectangle_3003_outgoinglinks=outgoing links
+NavigatorGroupName_Rhombus_3004_incominglinks=incoming links
+NavigatorGroupName_Rhombus_3004_outgoinglinks=outgoing links
+NavigatorGroupName_Port_3005_incominglinks=incoming links
+NavigatorGroupName_Port_3005_outgoinglinks=outgoing links
+NavigatorGroupName_Link_4001_target=target
+NavigatorGroupName_Link_4001_source=source
+NavigatorGroupName_LabeledLink_4002_target=target
+NavigatorGroupName_LabeledLink_4002_source=source
+NavigatorActionProvider_OpenDiagramActionName=Open Diagram
+MessageFormatParser_InvalidInputError=Invalid input at {0}
+LinklfModelingAssistantProviderTitle=Select domain model element
+LinklfModelingAssistantProviderMessage=Available domain model elements:
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/plugin.properties b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/plugin.properties
new file mode 100644
index 0000000..46b5f3c
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/plugin.properties
@@ -0,0 +1,49 @@
+pluginName=Links Look&Feel Plugin
+providerName=Eclipse Modeling Project
+
+editorName=Links Look&Feel Diagram Editing
+context.description=Links Look&Feel Diagram Editing
+context.name=In Links Look&Feel Diagram Editor
+newWizardName=Links Look&Feel Diagram
+newWizardDesc=Creates Links Look&Feel diagram.
+
+initDiagramActionLabel=Initialize LinksLF diagram file
+
+
+navigatorContentName=*.linklf_diagram diagram contents
+domainNavigatorContentName=*.linklf model contents
+update.diagram.name=Update LinksLF diagram
+update.diagram.description=Perform LinksLF diagram update
+
+
+# Property Sheet
+tab.appearance=Appearance
+tab.diagram=Rulers & Grid
+tab.domain=Core
+
+# Preferences
+prefpage.org.eclipse.gmf.tooling.examples.linklf.diagram.general=Links Look&Feel Diagram
+prefpage.org.eclipse.gmf.tooling.examples.linklf.diagram.appearance=Appearance
+prefpage.org.eclipse.gmf.tooling.examples.linklf.diagram.connections=Connections
+prefpage.org.eclipse.gmf.tooling.examples.linklf.diagram.printing=Printing
+prefpage.org.eclipse.gmf.tooling.examples.linklf.diagram.rulersAndGrid=Rulers And Grid
+
+
+# Providers
+metatype.name.Canvas_1000=Undefined
+metatype.name.Circle_2001=Circle
+metatype.name.Rectangle_2002=Rectangle
+metatype.name.Container_2003=Container
+metatype.name.Rhombus_2004=Rhombus
+metatype.name.Circle_3001=Circle
+metatype.name.Container_3002=Container
+metatype.name.Rectangle_3003=Rectangle
+metatype.name.Rhombus_3004=Rhombus
+metatype.name.Port_3005=Port
+metatype.name.Link_4001=Link
+metatype.name.LabeledLink_4002=LabeledLink
+
+# Commands and menu actions
+cmdcategory.name=LinksLF Editor Commands
+cmdcategory.desc=LinksLF Editor Commands
+
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/plugin.xml b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/plugin.xml
new file mode 100644
index 0000000..1473e5e
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/plugin.xml
@@ -0,0 +1,648 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+   <extension point="org.eclipse.team.core.fileTypes" id="repo-ftype">
+      <?gmfgen generated="true"?>
+      <fileTypes type="text" extension="linklf_diagram"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.extension_parser" id="resource-factory">
+      <?gmfgen generated="true"?>
+      <parser
+         type="linklf_diagram"
+         class="org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory">
+      </parser>
+   </extension>
+
+   <extension point="org.eclipse.ui.editors" id="gmf-editor">
+      <?gmfgen generated="true"?>
+      <editor
+         id="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorID"
+         name="%editorName"
+         icon="icons/obj16/LinklfDiagramFile.gif"
+         extensions="linklf_diagram"
+         default="true"
+         class="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditor"
+         matchingStrategy="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfMatchingStrategy"
+         contributorClass="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramActionBarContributor">
+      </editor>
+   </extension>
+
+   <extension point="org.eclipse.ui.contexts" id="ui-context">
+      <?gmfgen generated="true"?>
+      <context
+         description="%context.description"
+         id="org.eclipse.gmf.tooling.examples.linklf.diagram.ui.diagramContext"
+         name="%context.name"
+         parentId="org.eclipse.gmf.runtime.diagram.ui.diagramContext">
+      </context>
+   </extension>
+
+   <extension point="org.eclipse.ui.newWizards" id="creation-wizard">
+      <?gmfgen generated="true"?>
+      <wizard
+         name="%newWizardName"
+         icon="icons/obj16/LinklfDiagramFile.gif"
+         category="org.eclipse.ui.Examples"
+         class="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfCreationWizard"
+         id="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfCreationWizardID">
+         <description>%newWizardDesc</description>  
+      </wizard>
+   </extension>
+
+   <extension point="org.eclipse.ui.popupMenus" id="init-diagram-action">
+      <?gmfgen generated="true"?>
+      <objectContribution
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.InitDiagram"
+            nameFilter="*.linklf"
+            objectClass="org.eclipse.core.resources.IFile">
+         <action
+               label="%initDiagramActionLabel"
+               class="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfInitDiagramFileAction"
+               menubarPath="additions"
+               enablesFor="1"
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.InitDiagramAction">
+         </action>
+      </objectContribution>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.common.ui.services.action.globalActionHandlerProviders" id="global-actions">
+      <?gmfgen generated="true"?>
+      <GlobalActionHandlerProvider
+         class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramGlobalActionHandlerProvider"
+         id="linklfPresentation">
+         <Priority name="Lowest"/>
+         <ViewId id="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorID">
+            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
+               <GlobalActionId actionId="delete"/>
+            </ElementType>
+            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart">
+               <GlobalActionId actionId="save"/>
+            </ElementType>
+            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
+               <GlobalActionId actionId="save">
+               </GlobalActionId>
+            </ElementType>        
+         </ViewId>
+      </GlobalActionHandlerProvider>
+      <GlobalActionHandlerProvider
+         class="org.eclipse.gmf.runtime.diagram.ui.providers.ide.providers.DiagramIDEGlobalActionHandlerProvider"
+         id="linklfPresentationIDE">
+         <Priority name="Lowest"/>
+         <ViewId id="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorID">
+            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
+               <GlobalActionId actionId="bookmark"/>
+            </ElementType>
+         </ViewId>
+      </GlobalActionHandlerProvider>
+      <GlobalActionHandlerProvider
+            class="org.eclipse.gmf.runtime.diagram.ui.render.providers.DiagramUIRenderGlobalActionHandlerProvider"
+            id="linklfRender">
+         <Priority name="Lowest"/>
+         <ViewId id="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorID">
+            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
+               <GlobalActionId actionId="cut"/>
+               <GlobalActionId actionId="copy"/>
+               <GlobalActionId actionId="paste"/>
+            </ElementType>
+         </ViewId>
+      </GlobalActionHandlerProvider>
+   </extension>
+
+
+   <extension point="org.eclipse.core.runtime.preferences" id="prefs">
+      <?gmfgen generated="true"?>
+      <initializer class="org.eclipse.gmf.tooling.examples.linklf.diagram.preferences.DiagramPreferenceInitializer"/>
+   </extension>
+
+   <extension point="org.eclipse.ui.preferencePages" id="prefpages">
+      <?gmfgen generated="true"?>
+      <page
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.general"
+            name="%prefpage.org.eclipse.gmf.tooling.examples.linklf.diagram.general"
+            class="org.eclipse.gmf.tooling.examples.linklf.diagram.preferences.DiagramGeneralPreferencePage">
+      </page>
+      <page
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.appearance"
+            name="%prefpage.org.eclipse.gmf.tooling.examples.linklf.diagram.appearance"
+            category="org.eclipse.gmf.tooling.examples.linklf.diagram.general"
+            class="org.eclipse.gmf.tooling.examples.linklf.diagram.preferences.DiagramAppearancePreferencePage">
+      </page>
+      <page
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.connections"
+            name="%prefpage.org.eclipse.gmf.tooling.examples.linklf.diagram.connections"
+            category="org.eclipse.gmf.tooling.examples.linklf.diagram.general"
+            class="org.eclipse.gmf.tooling.examples.linklf.diagram.preferences.DiagramConnectionsPreferencePage">
+      </page>
+      <page
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.printing"
+            name="%prefpage.org.eclipse.gmf.tooling.examples.linklf.diagram.printing"
+            category="org.eclipse.gmf.tooling.examples.linklf.diagram.general"
+            class="org.eclipse.gmf.tooling.examples.linklf.diagram.preferences.DiagramPrintingPreferencePage">
+      </page>
+      <page
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.rulersAndGrid"
+            name="%prefpage.org.eclipse.gmf.tooling.examples.linklf.diagram.rulersAndGrid"
+            category="org.eclipse.gmf.tooling.examples.linklf.diagram.general"
+            class="org.eclipse.gmf.tooling.examples.linklf.diagram.preferences.DiagramRulersAndGridPreferencePage">
+      </page>
+   </extension>
+
+   <extension point="org.eclipse.ui.views.properties.tabbed.propertyContributor" id="prop-contrib">
+      <?gmfgen generated="true"?>
+      <propertyContributor
+            contributorId="org.eclipse.gmf.tooling.examples.linklf.diagram"
+            labelProvider="org.eclipse.gmf.tooling.examples.linklf.diagram.sheet.LinklfSheetLabelProvider">
+         <propertyCategory category="domain"/>
+         <propertyCategory category="visual"/>
+         <propertyCategory category="extra"/>
+      </propertyContributor>
+   </extension>
+
+   <extension point="org.eclipse.ui.views.properties.tabbed.propertyTabs" id="proptabs">
+      <?gmfgen generated="true"?>   
+      <propertyTabs contributorId="org.eclipse.gmf.tooling.examples.linklf.diagram">
+         <propertyTab
+             category="visual"
+             id="property.tab.AppearancePropertySection"
+             label="%tab.appearance"/>
+          <propertyTab
+             category="visual"
+             id="property.tab.DiagramPropertySection"
+             label="%tab.diagram"/>
+          <propertyTab
+             category="domain"
+             id="property.tab.domain"
+             label="%tab.domain"/>
+      </propertyTabs>
+   </extension>
+
+   <extension point="org.eclipse.ui.views.properties.tabbed.propertySections" id="propsections">
+      <?gmfgen generated="true"?>   
+      <propertySections contributorId="org.eclipse.gmf.tooling.examples.linklf.diagram">
+         <propertySection id="property.section.ConnectorAppearancePropertySection" 
+            filter="org.eclipse.gmf.runtime.diagram.ui.properties.filters.ConnectionEditPartPropertySectionFilter" 
+            class="org.eclipse.gmf.runtime.diagram.ui.properties.sections.appearance.ConnectionAppearancePropertySection" 
+            tab="property.tab.AppearancePropertySection">
+         </propertySection>
+         <propertySection id="property.section.ShapeColorAndFontPropertySection" 
+            filter="org.eclipse.gmf.runtime.diagram.ui.properties.filters.ShapeEditPartPropertySectionFilter" 
+            class="org.eclipse.gmf.runtime.diagram.ui.properties.sections.appearance.ShapeColorsAndFontsPropertySection" 
+            tab="property.tab.AppearancePropertySection">
+         </propertySection> 
+         <propertySection id="property.section.DiagramColorsAndFontsPropertySection" 
+            filter="org.eclipse.gmf.runtime.diagram.ui.properties.filters.DiagramEditPartPropertySectionFilter" 
+            class="org.eclipse.gmf.runtime.diagram.ui.properties.sections.appearance.DiagramColorsAndFontsPropertySection" 
+            tab="property.tab.AppearancePropertySection">
+         </propertySection>     
+         <propertySection id="property.section.RulerGridPropertySection" 
+            filter="org.eclipse.gmf.runtime.diagram.ui.properties.filters.DiagramEditPartPropertySectionFilter" 
+            class="org.eclipse.gmf.runtime.diagram.ui.properties.sections.grid.RulerGridPropertySection" 
+            tab="property.tab.DiagramPropertySection">
+         </propertySection>     
+         <propertySection
+            id="property.section.domain" 
+            tab="property.tab.domain"
+            class="org.eclipse.gmf.tooling.examples.linklf.diagram.sheet.LinklfPropertySection">
+            <input type="org.eclipse.gmf.runtime.notation.View"/>
+            <input type="org.eclipse.gef.EditPart"/>
+            <input type="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfAbstractNavigatorItem"/>
+         </propertySection>
+      </propertySections>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.diagram.core.viewProviders" id="view-provider">
+      <?gmfgen generated="true"?>
+      <viewProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfViewProvider">
+         <Priority name="Lowest"/>
+         <context viewClass="org.eclipse.gmf.runtime.notation.Diagram" semanticHints="linklf"/>
+         <context viewClass="org.eclipse.gmf.runtime.notation.Node" semanticHints="2001,2002,2003,2004,3001,3002,3003,3004,3005"/>
+         <context viewClass="org.eclipse.gmf.runtime.notation.Edge" semanticHints="4001,4002"/>
+      </viewProvider>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.diagram.ui.editpartProviders" id="ep-provider">
+      <?gmfgen generated="true"?>
+      <editpartProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfEditPartProvider">
+         <Priority name="Lowest"/>
+         <object class="org.eclipse.gmf.runtime.notation.Diagram" id="generated-diagram">
+            <method name="getType()" value="linklf"/>
+         </object>
+         <object class="org.eclipse.gmf.runtime.notation.Node" id="generated-nodes">
+            <method name="getType()" value="2001,2002,2003,2004,3001,3002,3003,3004,3005"/>
+         </object>
+         <object class="org.eclipse.gmf.runtime.notation.Edge" id="generated-links">
+            <method name="getType()" value="4001,4002"/>
+         </object>
+         <object class="org.eclipse.gmf.runtime.notation.Node" id="generated-labels">
+            <method name="getType()" value="5002,5001"/>
+         </object>
+         <object class="org.eclipse.gmf.runtime.notation.Node" id="generated-compartments">
+            <method name="getType()" value="7001,7002"/>
+         </object>
+         <context views="generated-diagram,generated-nodes,generated-links,generated-labels,generated-compartments"/>
+      </editpartProvider>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.emf.ui.modelingAssistantProviders" id="modelassist-provider">
+	<?gmfgen generated="true"?>
+	<modelingAssistantProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants.LinklfModelingAssistantProviderOfCanvasEditPart">
+		<Priority name="Lowest"/>
+		<object class="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart" id="Canvas_1000"/>
+		<context elements="Canvas_1000"/>
+	</modelingAssistantProvider>
+	<modelingAssistantProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants.LinklfModelingAssistantProviderOfCircleEditPart">
+		<Priority name="Lowest"/>
+		<object class="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart" id="Circle_2001"/>
+		<context elements="Circle_2001"/>
+	</modelingAssistantProvider>
+	<modelingAssistantProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants.LinklfModelingAssistantProviderOfRectangleEditPart">
+		<Priority name="Lowest"/>
+		<object class="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart" id="Rectangle_2002"/>
+		<context elements="Rectangle_2002"/>
+	</modelingAssistantProvider>
+	<modelingAssistantProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants.LinklfModelingAssistantProviderOfContainerEditPart">
+		<Priority name="Lowest"/>
+		<object class="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerEditPart" id="Container_2003"/>
+		<context elements="Container_2003"/>
+	</modelingAssistantProvider>
+	<modelingAssistantProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants.LinklfModelingAssistantProviderOfRhombusEditPart">
+		<Priority name="Lowest"/>
+		<object class="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart" id="Rhombus_2004"/>
+		<context elements="Rhombus_2004"/>
+	</modelingAssistantProvider>
+	<modelingAssistantProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants.LinklfModelingAssistantProviderOfCircle2EditPart">
+		<Priority name="Lowest"/>
+		<object class="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart" id="Circle_3001"/>
+		<context elements="Circle_3001"/>
+	</modelingAssistantProvider>
+	<modelingAssistantProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants.LinklfModelingAssistantProviderOfContainer2EditPart">
+		<Priority name="Lowest"/>
+		<object class="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart" id="Container_3002"/>
+		<context elements="Container_3002"/>
+	</modelingAssistantProvider>
+	<modelingAssistantProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants.LinklfModelingAssistantProviderOfRectangle2EditPart">
+		<Priority name="Lowest"/>
+		<object class="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart" id="Rectangle_3003"/>
+		<context elements="Rectangle_3003"/>
+	</modelingAssistantProvider>
+	<modelingAssistantProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants.LinklfModelingAssistantProviderOfRhombus2EditPart">
+		<Priority name="Lowest"/>
+		<object class="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart" id="Rhombus_3004"/>
+		<context elements="Rhombus_3004"/>
+	</modelingAssistantProvider>
+	<modelingAssistantProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants.LinklfModelingAssistantProviderOfPortEditPart">
+		<Priority name="Lowest"/>
+		<object class="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart" id="Port_3005"/>
+		<context elements="Port_3005"/>
+	</modelingAssistantProvider>
+</extension>
+
+   <extension point="org.eclipse.gmf.runtime.common.ui.services.iconProviders" id="icon-provider">
+      <?gmfgen generated="true"?>
+      <IconProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfIconProvider">
+         <Priority name="Low"/>
+      </IconProvider>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.common.ui.services.parserProviders" id="parser-provider">
+      <?gmfgen generated="true"?>
+      <ParserProvider class="org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfParserProvider">
+         <Priority name="Lowest"/>
+      </ParserProvider>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.emf.type.core.elementTypes" id="element-types">
+      <?gmfgen generated="true"?>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <metamodelType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Canvas_1000"
+               name="%metatype.name.Canvas_1000"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Canvas"
+               edithelper="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers.CanvasEditHelper">
+            <param name="semanticHint" value="1000"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <metamodelType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Circle_2001"
+               name="%metatype.name.Circle_2001"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Circle"
+               edithelper="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers.CircleEditHelper">
+            <param name="semanticHint" value="2001"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <metamodelType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Rectangle_2002"
+               name="%metatype.name.Rectangle_2002"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Rectangle"
+               edithelper="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers.RectangleEditHelper">
+            <param name="semanticHint" value="2002"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <metamodelType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Container_2003"
+               name="%metatype.name.Container_2003"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Container"
+               edithelper="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers.ContainerEditHelper">
+            <param name="semanticHint" value="2003"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <specializationType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Rhombus_2004"
+               name="%metatype.name.Rhombus_2004"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType">
+            <specializes id="org.eclipse.gmf.tooling.examples.linklf.diagram.Rhombus_3004"/>
+            <param name="semanticHint" value="2004"/>
+         </specializationType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <specializationType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Circle_3001"
+               name="%metatype.name.Circle_3001"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType">
+            <specializes id="org.eclipse.gmf.tooling.examples.linklf.diagram.Circle_2001"/>
+            <param name="semanticHint" value="3001"/>
+         </specializationType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <specializationType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Container_3002"
+               name="%metatype.name.Container_3002"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType">
+            <specializes id="org.eclipse.gmf.tooling.examples.linklf.diagram.Container_2003"/>
+            <param name="semanticHint" value="3002"/>
+         </specializationType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <specializationType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Rectangle_3003"
+               name="%metatype.name.Rectangle_3003"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType">
+            <specializes id="org.eclipse.gmf.tooling.examples.linklf.diagram.Rectangle_2002"/>
+            <param name="semanticHint" value="3003"/>
+         </specializationType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <metamodelType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Rhombus_3004"
+               name="%metatype.name.Rhombus_3004"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Rhombus"
+               edithelper="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers.RhombusEditHelper">
+            <param name="semanticHint" value="3004"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <metamodelType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Port_3005"
+               name="%metatype.name.Port_3005"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Port"
+               edithelper="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers.PortEditHelper">
+            <param name="semanticHint" value="3005"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <metamodelType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.Link_4001"
+               name="%metatype.name.Link_4001"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Link"
+               edithelper="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers.LinkEditHelper">
+            <param name="semanticHint" value="4001"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://linklf.gmf.eclipse.org">
+         <metamodelType
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.LabeledLink_4002"
+               name="%metatype.name.LabeledLink_4002"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="LabeledLink"
+               edithelper="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers.LabeledLinkEditHelper">
+            <param name="semanticHint" value="4002"/>
+         </metamodelType>
+      </metamodel>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.emf.type.core.elementTypeBindings" id="element-types-bindings">
+      <?gmfgen generated="true"?>
+      <clientContext id="org.eclipse.gmf.tooling.examples.linklf.diagram.TypeContext">
+         <enablement>
+            <test
+               property="org.eclipse.gmf.runtime.emf.core.editingDomain"
+               value="org.eclipse.gmf.tooling.examples.linklf.diagram.EditingDomain"/>
+         </enablement>
+      </clientContext> 
+      <binding context="org.eclipse.gmf.tooling.examples.linklf.diagram.TypeContext">
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Canvas_1000"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Circle_2001"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Rectangle_2002"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Container_2003"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Rhombus_2004"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Circle_3001"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Container_3002"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Rectangle_3003"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Rhombus_3004"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Port_3005"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.Link_4001"/>
+         <elementType ref="org.eclipse.gmf.tooling.examples.linklf.diagram.LabeledLink_4002"/>
+         <advice ref="org.eclipse.gmf.runtime.diagram.core.advice.notationDepdendents"/>
+      </binding>
+   </extension>
+	   <extension point="org.eclipse.core.expressions.propertyTesters" id="navigator-proptest.isURIEditorInput">
+      <?gmfgen generated="true"?>
+      <propertyTester
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.URIEditorInputPropertyTester"
+            type="org.eclipse.emf.common.ui.URIEditorInput"
+            namespace="org.eclipse.gmf.tooling.examples.linklf.diagram"
+            properties="isURIEditorInput"
+            class="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfUriEditorInputTester">
+      </propertyTester>
+   </extension>
+
+
+   <extension point="org.eclipse.ui.navigator.viewer" id="navigator-viewbinding">
+      <?gmfgen generated="true"?>
+      <viewerContentBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer">
+         <includes>
+            <contentExtension pattern="org.eclipse.gmf.tooling.examples.linklf.diagram.resourceContent"/>
+            <contentExtension pattern="org.eclipse.gmf.tooling.examples.linklf.diagram.domainResourceContent"/>
+            <contentExtension pattern="org.eclipse.gmf.tooling.examples.linklf.diagram.navigatorLinkHelper"/>
+         </includes>
+      </viewerContentBinding>
+      <viewerActionBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer">
+         <includes>
+            <actionExtension pattern="org.eclipse.gmf.tooling.examples.linklf.diagram.navigatorActionProvider"/>
+         </includes>
+      </viewerActionBinding>
+   </extension>
+
+   <extension point="org.eclipse.ui.navigator.navigatorContent" id="navigator-content">
+      <?gmfgen generated="true"?>
+      <navigatorContent
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.resourceContent" 
+            name="%navigatorContentName" 
+            priority="normal" 
+            contentProvider="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorContentProvider" 
+            labelProvider="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorLabelProvider"
+            icon="icons/obj16/LinklfDiagramFile.gif"
+            activeByDefault="true">
+         <triggerPoints>
+            <or>
+               <and>
+                  <instanceof value="org.eclipse.core.resources.IFile"/>
+                  <test property="org.eclipse.core.resources.extension" value="linklf_diagram"/>
+               </and>
+               <instanceof value="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfAbstractNavigatorItem"/>
+            </or>
+         </triggerPoints>
+         <possibleChildren>
+            <or>
+               <instanceof value="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfAbstractNavigatorItem"/>
+            </or>
+         </possibleChildren>
+         <commonSorter 
+               id="org.eclipse.gmf.tooling.examples.linklf.diagram.navigatorSorter" 
+               class="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorSorter">
+            <parentExpression>
+               <or>
+                  <and>
+                     <instanceof value="org.eclipse.core.resources.IFile"/>
+                     <test property="org.eclipse.core.resources.extension" value="linklf_diagram"/>
+                  </and>
+                  <instanceof value="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfAbstractNavigatorItem"/>
+               </or>
+            </parentExpression>
+         </commonSorter>
+      </navigatorContent>
+      <navigatorContent
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.domainResourceContent" 
+            name="%domainNavigatorContentName" 
+            priority="normal" 
+            contentProvider="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfDomainNavigatorContentProvider" 
+            labelProvider="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfDomainNavigatorLabelProvider"
+            icon="icons/obj16/LinklfDiagramFile.gif"
+            activeByDefault="true">
+         <triggerPoints>
+            <or>
+               <and>
+                  <instanceof value="org.eclipse.core.resources.IFile"/>
+                  <test property="org.eclipse.core.resources.extension" value="linklf"/>
+               </and>
+               <instanceof value="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfDomainNavigatorItem"/>
+            </or>
+         </triggerPoints>
+         <possibleChildren>
+            <instanceof value="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfDomainNavigatorItem"/>
+         </possibleChildren>
+      </navigatorContent>
+      <actionProvider
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.navigatorActionProvider"
+            class="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorActionProvider">
+         <enablement>
+            <or>
+               <instanceof value="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfAbstractNavigatorItem"/>
+            </or>
+         </enablement>
+      </actionProvider>
+   </extension>
+	
+	   <extension point="org.eclipse.ui.navigator.linkHelper" id="navigator-linkhelper">
+      <?gmfgen generated="true"?>
+      <linkHelper
+            id="org.eclipse.gmf.tooling.examples.linklf.diagram.navigatorLinkHelper"
+            class="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorLinkHelper">
+         <editorInputEnablement>
+            <and>
+               <instanceof value="org.eclipse.emf.common.ui.URIEditorInput"/>
+               <test property="org.eclipse.gmf.tooling.examples.linklf.diagram.isURIEditorInput"/>
+            </and>
+         </editorInputEnablement>
+         <selectionEnablement>
+            <instanceof value="org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfAbstractNavigatorItem"/>
+         </selectionEnablement>
+      </linkHelper>
+   </extension>
+
+
+   <extension point="org.eclipse.ui.commands" id="update-cmd">
+      <?gmfgen generated="true"?>
+      <command
+         categoryId="org.eclipse.ui.category.edit"
+         defaultHandler="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramUpdateCommand"
+         description="%update.diagram.description"
+         id="org.eclipse.gmf.tooling.examples.linklf.diagram.updateDiagram"
+         name="%update.diagram.name"/>
+   </extension>
+
+   <extension point="org.eclipse.ui.bindings" id="update-cmd-binding">
+      <?gmfgen generated="true"?>
+      <key 
+         commandId="org.eclipse.gmf.tooling.examples.linklf.diagram.updateDiagram"
+         contextId="org.eclipse.gmf.tooling.examples.linklf.diagram.ui.diagramContext"
+         schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+         sequence="F5"/>
+   </extension>
+
+   <extension point="org.eclipse.ui.menus" id="context-menus">
+      <?gmfgen generated="true"?>
+      <!-- menuContribution locationURI="menu:org.eclipse.ui.main.menu?after=">
+      </menuContribution>
+      <menuContribution locationURI="toolbar:org.eclipse.ui.main.toolbar?after=">
+      </menuContribution -->
+      <menuContribution locationURI="popup:org.eclipse.gmf.runtime.diagram.ui.DiagramEditorContextMenu">
+         <command commandId="org.eclipse.gmf.tooling.examples.linklf.diagram.LoadResourceAction">
+            <visibleWhen>
+               <and>
+                  <with variable="activePartId"><equals value="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorID"/></with>
+                  <with variable="selection"><iterate ifEmpty="false"> 
+                     <instanceof value="org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart"/>
+                  </iterate></with>
+               </and>
+            </visibleWhen>
+         </command>
+      </menuContribution>
+   </extension>
+
+   <extension point="org.eclipse.ui.commands" id="menu-commands">
+      <?gmfgen generated="true"?>
+      <category id="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorID" name="%cmdcategory.name" description="%cmdcategory.desc"/>
+      <command id="org.eclipse.gmf.tooling.examples.linklf.diagram.LoadResourceAction"
+         name="Load Resource"
+         categoryId="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorID"
+         defaultHandler="org.eclipse.gmf.tooling.examples.linklf.diagram.part.LoadResourceAction"/>
+   </extension>
+
+   <extension point="org.eclipse.ui.handlers" id="menu-handlers">
+      <?gmfgen generated="true"?>
+   </extension>
+
+   <!-- optionally, specify keybindings -->
+   
+   <extension
+         id="diagramUIRenderEditPartProvider.linksLF"
+         name="Custom DiagramRootEditPartProvider for LinksLF diagram"
+         point="org.eclipse.gmf.runtime.diagram.ui.editpartProviders">
+      <editpartProvider
+            class="org.eclipse.gmf.tooling.runtime.linklf.router.provider.CustomRoutersDiagramRootEditPartProvider">
+         <Priority
+               name="Medium">
+         </Priority>
+         <object class="org.eclipse.gmf.runtime.notation.Diagram" id="generated-diagram-root">
+            <method name="getType()" value="linklf"/>
+         </object>
+         <context providesRootEditPart="true" views="generated-diagram-root"/>
+         <applicable-diagram type="linklf"/>
+      </editpartProvider>
+   </extension>
+   
+</plugin>
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/pom.xml b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/pom.xml
new file mode 100644
index 0000000..c1af022
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/pom.xml
@@ -0,0 +1,23 @@
+<!--
+ * Copyright (c) 2013 Montages AG
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+-->
+<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>
+  <groupId>org.eclipse.gmf-tooling</groupId>
+  <artifactId>org.eclipse.gmf.tooling.examples.linklf.diagram</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+  
+  <parent>
+  	<groupId>org.eclipse.gmf-tooling</groupId>
+	<artifactId>xtend</artifactId>
+	<version>1.0.0-SNAPSHOT</version>
+	<relativePath>../</relativePath>
+  </parent>
+
+</project>
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Circle2CreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Circle2CreateCommand.java
new file mode 100644
index 0000000..0803353
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Circle2CreateCommand.java
@@ -0,0 +1,79 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.Circle;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+
+/**
+ * @generated
+ */
+public class Circle2CreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	public Circle2CreateCommand(CreateElementRequest req) {
+		super(req.getLabel(), null, req);
+	}
+
+	/**
+	 * FIXME: replace with setElementToEdit()
+	 * @generated
+	 */
+	protected EObject getElementToEdit() {
+		EObject container = ((CreateElementRequest) getRequest()).getContainer();
+		if (container instanceof View) {
+			container = ((View) container).getElement();
+		}
+		return container;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		return true;
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		Circle newElement = LinklfFactory.eINSTANCE.createCircle();
+
+		CanvasElementContainer owner = (CanvasElementContainer) getElementToEdit();
+		owner.getElements().add(newElement);
+
+		doConfigure(newElement, monitor, info);
+
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(Circle newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/CircleCreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/CircleCreateCommand.java
new file mode 100644
index 0000000..93b70cd
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/CircleCreateCommand.java
@@ -0,0 +1,79 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.Circle;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+
+/**
+ * @generated
+ */
+public class CircleCreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	public CircleCreateCommand(CreateElementRequest req) {
+		super(req.getLabel(), null, req);
+	}
+
+	/**
+	 * FIXME: replace with setElementToEdit()
+	 * @generated
+	 */
+	protected EObject getElementToEdit() {
+		EObject container = ((CreateElementRequest) getRequest()).getContainer();
+		if (container instanceof View) {
+			container = ((View) container).getElement();
+		}
+		return container;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		return true;
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		Circle newElement = LinklfFactory.eINSTANCE.createCircle();
+
+		CanvasElementContainer owner = (CanvasElementContainer) getElementToEdit();
+		owner.getElements().add(newElement);
+
+		doConfigure(newElement, monitor, info);
+
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(Circle newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Container2CreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Container2CreateCommand.java
new file mode 100644
index 0000000..a8ecc00
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Container2CreateCommand.java
@@ -0,0 +1,79 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.Container;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+
+/**
+ * @generated
+ */
+public class Container2CreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	public Container2CreateCommand(CreateElementRequest req) {
+		super(req.getLabel(), null, req);
+	}
+
+	/**
+	 * FIXME: replace with setElementToEdit()
+	 * @generated
+	 */
+	protected EObject getElementToEdit() {
+		EObject container = ((CreateElementRequest) getRequest()).getContainer();
+		if (container instanceof View) {
+			container = ((View) container).getElement();
+		}
+		return container;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		return true;
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		Container newElement = LinklfFactory.eINSTANCE.createContainer();
+
+		CanvasElementContainer owner = (CanvasElementContainer) getElementToEdit();
+		owner.getElements().add(newElement);
+
+		doConfigure(newElement, monitor, info);
+
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(Container newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/ContainerCreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/ContainerCreateCommand.java
new file mode 100644
index 0000000..79e7ca2
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/ContainerCreateCommand.java
@@ -0,0 +1,79 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.Container;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+
+/**
+ * @generated
+ */
+public class ContainerCreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	public ContainerCreateCommand(CreateElementRequest req) {
+		super(req.getLabel(), null, req);
+	}
+
+	/**
+	 * FIXME: replace with setElementToEdit()
+	 * @generated
+	 */
+	protected EObject getElementToEdit() {
+		EObject container = ((CreateElementRequest) getRequest()).getContainer();
+		if (container instanceof View) {
+			container = ((View) container).getElement();
+		}
+		return container;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		return true;
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		Container newElement = LinklfFactory.eINSTANCE.createContainer();
+
+		CanvasElementContainer owner = (CanvasElementContainer) getElementToEdit();
+		owner.getElements().add(newElement);
+
+		doConfigure(newElement, monitor, info);
+
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(Container newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LabeledLinkCreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LabeledLinkCreateCommand.java
new file mode 100644
index 0000000..7edcd61
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LabeledLinkCreateCommand.java
@@ -0,0 +1,152 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.LabeledLink;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+import org.eclipse.gmf.tooling.examples.linklf.Node;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfBaseItemSemanticEditPolicy;
+
+/**
+ * @generated
+ */
+public class LabeledLinkCreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	private final EObject source;
+
+	/**
+	 * @generated
+	 */
+	private final EObject target;
+
+	/**
+	 * @generated
+	 */
+	private final CanvasElementContainer container;
+
+	/**
+	 * @generated
+	 */
+	public LabeledLinkCreateCommand(CreateRelationshipRequest request, EObject source, EObject target) {
+		super(request.getLabel(), null, request);
+		this.source = source;
+		this.target = target;
+		container = deduceContainer(source, target);
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		if (source == null && target == null) {
+			return false;
+		}
+		if (source != null && false == source instanceof Node) {
+			return false;
+		}
+		if (target != null && false == target instanceof Node) {
+			return false;
+		}
+		if (getSource() == null) {
+			return true; // link creation is in progress; source is not defined yet
+		}
+		// target may be null here but it's possible to check constraint
+		if (getContainer() == null) {
+			return false;
+		}
+		return LinklfBaseItemSemanticEditPolicy.getLinkConstraints().canCreateLabeledLink_4002(getContainer(), getSource(), getTarget());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		if (!canExecute()) {
+			throw new ExecutionException("Invalid arguments in create link command"); //$NON-NLS-1$
+		}
+
+		LabeledLink newElement = LinklfFactory.eINSTANCE.createLabeledLink();
+		getContainer().getElements().add(newElement);
+		newElement.setSource(getSource());
+		newElement.setTarget(getTarget());
+		doConfigure(newElement, monitor, info);
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(LabeledLink newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		configureRequest.setParameter(CreateRelationshipRequest.SOURCE, getSource());
+		configureRequest.setParameter(CreateRelationshipRequest.TARGET, getTarget());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setElementToEdit(EObject element) {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getSource() {
+		return (Node) source;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getTarget() {
+		return (Node) target;
+	}
+
+	/**
+	 * @generated
+	 */
+	public CanvasElementContainer getContainer() {
+		return container;
+	}
+
+	/**
+	 * Default approach is to traverse ancestors of the source to find instance of container.
+	 * Modify with appropriate logic.
+	 * @generated
+	 */
+	private static CanvasElementContainer deduceContainer(EObject source, EObject target) {
+		// Find container element for the new link.
+		// Climb up by containment hierarchy starting from the source
+		// and return the first element that is instance of the container class.
+		for (EObject element = source; element != null; element = element.eContainer()) {
+			if (element instanceof CanvasElementContainer) {
+				return (CanvasElementContainer) element;
+			}
+		}
+		return null;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LabeledLinkReorientCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LabeledLinkReorientCommand.java
new file mode 100644
index 0000000..a915ee1
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LabeledLinkReorientCommand.java
@@ -0,0 +1,157 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.LabeledLink;
+import org.eclipse.gmf.tooling.examples.linklf.Node;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfBaseItemSemanticEditPolicy;
+
+/**
+ * @generated
+ */
+public class LabeledLinkReorientCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	private final int reorientDirection;
+
+	/**
+	 * @generated
+	 */
+	private final EObject oldEnd;
+
+	/**
+	 * @generated
+	 */
+	private final EObject newEnd;
+
+	/**
+	 * @generated
+	 */
+	public LabeledLinkReorientCommand(ReorientRelationshipRequest request) {
+		super(request.getLabel(), request.getRelationship(), request);
+		reorientDirection = request.getDirection();
+		oldEnd = request.getOldRelationshipEnd();
+		newEnd = request.getNewRelationshipEnd();
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		if (false == getElementToEdit() instanceof LabeledLink) {
+			return false;
+		}
+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
+			return canReorientSource();
+		}
+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
+			return canReorientTarget();
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean canReorientSource() {
+		if (!(oldEnd instanceof Node && newEnd instanceof Node)) {
+			return false;
+		}
+		Node target = getLink().getTarget();
+		if (!(getLink().eContainer() instanceof CanvasElementContainer)) {
+			return false;
+		}
+		CanvasElementContainer container = (CanvasElementContainer) getLink().eContainer();
+		return LinklfBaseItemSemanticEditPolicy.getLinkConstraints().canExistLabeledLink_4002(container, getLink(), getNewSource(), target);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean canReorientTarget() {
+		if (!(oldEnd instanceof Node && newEnd instanceof Node)) {
+			return false;
+		}
+		Node source = getLink().getSource();
+		if (!(getLink().eContainer() instanceof CanvasElementContainer)) {
+			return false;
+		}
+		CanvasElementContainer container = (CanvasElementContainer) getLink().eContainer();
+		return LinklfBaseItemSemanticEditPolicy.getLinkConstraints().canExistLabeledLink_4002(container, getLink(), source, getNewTarget());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		if (!canExecute()) {
+			throw new ExecutionException("Invalid arguments in reorient link command"); //$NON-NLS-1$
+		}
+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
+			return reorientSource();
+		}
+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
+			return reorientTarget();
+		}
+		throw new IllegalStateException();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult reorientSource() throws ExecutionException {
+		getLink().setSource(getNewSource());
+		return CommandResult.newOKCommandResult(getLink());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult reorientTarget() throws ExecutionException {
+		getLink().setTarget(getNewTarget());
+		return CommandResult.newOKCommandResult(getLink());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected LabeledLink getLink() {
+		return (LabeledLink) getElementToEdit();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getOldSource() {
+		return (Node) oldEnd;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getNewSource() {
+		return (Node) newEnd;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getOldTarget() {
+		return (Node) oldEnd;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getNewTarget() {
+		return (Node) newEnd;
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LinkCreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LinkCreateCommand.java
new file mode 100644
index 0000000..1af8dd5
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LinkCreateCommand.java
@@ -0,0 +1,152 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.Link;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+import org.eclipse.gmf.tooling.examples.linklf.Node;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfBaseItemSemanticEditPolicy;
+
+/**
+ * @generated
+ */
+public class LinkCreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	private final EObject source;
+
+	/**
+	 * @generated
+	 */
+	private final EObject target;
+
+	/**
+	 * @generated
+	 */
+	private final CanvasElementContainer container;
+
+	/**
+	 * @generated
+	 */
+	public LinkCreateCommand(CreateRelationshipRequest request, EObject source, EObject target) {
+		super(request.getLabel(), null, request);
+		this.source = source;
+		this.target = target;
+		container = deduceContainer(source, target);
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		if (source == null && target == null) {
+			return false;
+		}
+		if (source != null && false == source instanceof Node) {
+			return false;
+		}
+		if (target != null && false == target instanceof Node) {
+			return false;
+		}
+		if (getSource() == null) {
+			return true; // link creation is in progress; source is not defined yet
+		}
+		// target may be null here but it's possible to check constraint
+		if (getContainer() == null) {
+			return false;
+		}
+		return LinklfBaseItemSemanticEditPolicy.getLinkConstraints().canCreateLink_4001(getContainer(), getSource(), getTarget());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		if (!canExecute()) {
+			throw new ExecutionException("Invalid arguments in create link command"); //$NON-NLS-1$
+		}
+
+		Link newElement = LinklfFactory.eINSTANCE.createLink();
+		getContainer().getElements().add(newElement);
+		newElement.setSource(getSource());
+		newElement.setTarget(getTarget());
+		doConfigure(newElement, monitor, info);
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(Link newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		configureRequest.setParameter(CreateRelationshipRequest.SOURCE, getSource());
+		configureRequest.setParameter(CreateRelationshipRequest.TARGET, getTarget());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setElementToEdit(EObject element) {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getSource() {
+		return (Node) source;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getTarget() {
+		return (Node) target;
+	}
+
+	/**
+	 * @generated
+	 */
+	public CanvasElementContainer getContainer() {
+		return container;
+	}
+
+	/**
+	 * Default approach is to traverse ancestors of the source to find instance of container.
+	 * Modify with appropriate logic.
+	 * @generated
+	 */
+	private static CanvasElementContainer deduceContainer(EObject source, EObject target) {
+		// Find container element for the new link.
+		// Climb up by containment hierarchy starting from the source
+		// and return the first element that is instance of the container class.
+		for (EObject element = source; element != null; element = element.eContainer()) {
+			if (element instanceof CanvasElementContainer) {
+				return (CanvasElementContainer) element;
+			}
+		}
+		return null;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LinkReorientCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LinkReorientCommand.java
new file mode 100644
index 0000000..560a851
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/LinkReorientCommand.java
@@ -0,0 +1,157 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.Link;
+import org.eclipse.gmf.tooling.examples.linklf.Node;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfBaseItemSemanticEditPolicy;
+
+/**
+ * @generated
+ */
+public class LinkReorientCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	private final int reorientDirection;
+
+	/**
+	 * @generated
+	 */
+	private final EObject oldEnd;
+
+	/**
+	 * @generated
+	 */
+	private final EObject newEnd;
+
+	/**
+	 * @generated
+	 */
+	public LinkReorientCommand(ReorientRelationshipRequest request) {
+		super(request.getLabel(), request.getRelationship(), request);
+		reorientDirection = request.getDirection();
+		oldEnd = request.getOldRelationshipEnd();
+		newEnd = request.getNewRelationshipEnd();
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		if (false == getElementToEdit() instanceof Link) {
+			return false;
+		}
+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
+			return canReorientSource();
+		}
+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
+			return canReorientTarget();
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean canReorientSource() {
+		if (!(oldEnd instanceof Node && newEnd instanceof Node)) {
+			return false;
+		}
+		Node target = getLink().getTarget();
+		if (!(getLink().eContainer() instanceof CanvasElementContainer)) {
+			return false;
+		}
+		CanvasElementContainer container = (CanvasElementContainer) getLink().eContainer();
+		return LinklfBaseItemSemanticEditPolicy.getLinkConstraints().canExistLink_4001(container, getLink(), getNewSource(), target);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean canReorientTarget() {
+		if (!(oldEnd instanceof Node && newEnd instanceof Node)) {
+			return false;
+		}
+		Node source = getLink().getSource();
+		if (!(getLink().eContainer() instanceof CanvasElementContainer)) {
+			return false;
+		}
+		CanvasElementContainer container = (CanvasElementContainer) getLink().eContainer();
+		return LinklfBaseItemSemanticEditPolicy.getLinkConstraints().canExistLink_4001(container, getLink(), source, getNewTarget());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		if (!canExecute()) {
+			throw new ExecutionException("Invalid arguments in reorient link command"); //$NON-NLS-1$
+		}
+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
+			return reorientSource();
+		}
+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
+			return reorientTarget();
+		}
+		throw new IllegalStateException();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult reorientSource() throws ExecutionException {
+		getLink().setSource(getNewSource());
+		return CommandResult.newOKCommandResult(getLink());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult reorientTarget() throws ExecutionException {
+		getLink().setTarget(getNewTarget());
+		return CommandResult.newOKCommandResult(getLink());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Link getLink() {
+		return (Link) getElementToEdit();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getOldSource() {
+		return (Node) oldEnd;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getNewSource() {
+		return (Node) newEnd;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getOldTarget() {
+		return (Node) oldEnd;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Node getNewTarget() {
+		return (Node) newEnd;
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/PortCreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/PortCreateCommand.java
new file mode 100644
index 0000000..4481558
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/PortCreateCommand.java
@@ -0,0 +1,79 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.Container;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+import org.eclipse.gmf.tooling.examples.linklf.Port;
+
+/**
+ * @generated
+ */
+public class PortCreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	public PortCreateCommand(CreateElementRequest req) {
+		super(req.getLabel(), null, req);
+	}
+
+	/**
+	 * FIXME: replace with setElementToEdit()
+	 * @generated
+	 */
+	protected EObject getElementToEdit() {
+		EObject container = ((CreateElementRequest) getRequest()).getContainer();
+		if (container instanceof View) {
+			container = ((View) container).getElement();
+		}
+		return container;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		return true;
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		Port newElement = LinklfFactory.eINSTANCE.createPort();
+
+		Container owner = (Container) getElementToEdit();
+		owner.getPorst().add(newElement);
+
+		doConfigure(newElement, monitor, info);
+
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(Port newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Rectangle2CreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Rectangle2CreateCommand.java
new file mode 100644
index 0000000..ce5c53a
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Rectangle2CreateCommand.java
@@ -0,0 +1,79 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+import org.eclipse.gmf.tooling.examples.linklf.Rectangle;
+
+/**
+ * @generated
+ */
+public class Rectangle2CreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	public Rectangle2CreateCommand(CreateElementRequest req) {
+		super(req.getLabel(), null, req);
+	}
+
+	/**
+	 * FIXME: replace with setElementToEdit()
+	 * @generated
+	 */
+	protected EObject getElementToEdit() {
+		EObject container = ((CreateElementRequest) getRequest()).getContainer();
+		if (container instanceof View) {
+			container = ((View) container).getElement();
+		}
+		return container;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		return true;
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		Rectangle newElement = LinklfFactory.eINSTANCE.createRectangle();
+
+		CanvasElementContainer owner = (CanvasElementContainer) getElementToEdit();
+		owner.getElements().add(newElement);
+
+		doConfigure(newElement, monitor, info);
+
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(Rectangle newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/RectangleCreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/RectangleCreateCommand.java
new file mode 100644
index 0000000..8cf8fb3
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/RectangleCreateCommand.java
@@ -0,0 +1,79 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+import org.eclipse.gmf.tooling.examples.linklf.Rectangle;
+
+/**
+ * @generated
+ */
+public class RectangleCreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	public RectangleCreateCommand(CreateElementRequest req) {
+		super(req.getLabel(), null, req);
+	}
+
+	/**
+	 * FIXME: replace with setElementToEdit()
+	 * @generated
+	 */
+	protected EObject getElementToEdit() {
+		EObject container = ((CreateElementRequest) getRequest()).getContainer();
+		if (container instanceof View) {
+			container = ((View) container).getElement();
+		}
+		return container;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		return true;
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		Rectangle newElement = LinklfFactory.eINSTANCE.createRectangle();
+
+		CanvasElementContainer owner = (CanvasElementContainer) getElementToEdit();
+		owner.getElements().add(newElement);
+
+		doConfigure(newElement, monitor, info);
+
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(Rectangle newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Rhombus2CreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Rhombus2CreateCommand.java
new file mode 100644
index 0000000..df5f5a2
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/Rhombus2CreateCommand.java
@@ -0,0 +1,79 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+import org.eclipse.gmf.tooling.examples.linklf.Rhombus;
+
+/**
+ * @generated
+ */
+public class Rhombus2CreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	public Rhombus2CreateCommand(CreateElementRequest req) {
+		super(req.getLabel(), null, req);
+	}
+
+	/**
+	 * FIXME: replace with setElementToEdit()
+	 * @generated
+	 */
+	protected EObject getElementToEdit() {
+		EObject container = ((CreateElementRequest) getRequest()).getContainer();
+		if (container instanceof View) {
+			container = ((View) container).getElement();
+		}
+		return container;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		return true;
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		Rhombus newElement = LinklfFactory.eINSTANCE.createRhombus();
+
+		CanvasElementContainer owner = (CanvasElementContainer) getElementToEdit();
+		owner.getElements().add(newElement);
+
+		doConfigure(newElement, monitor, info);
+
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(Rhombus newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/RhombusCreateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/RhombusCreateCommand.java
new file mode 100644
index 0000000..bc5ec14
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/commands/RhombusCreateCommand.java
@@ -0,0 +1,79 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+import org.eclipse.gmf.tooling.examples.linklf.Rhombus;
+
+/**
+ * @generated
+ */
+public class RhombusCreateCommand extends EditElementCommand {
+
+	/**
+	 * @generated
+	 */
+	public RhombusCreateCommand(CreateElementRequest req) {
+		super(req.getLabel(), null, req);
+	}
+
+	/**
+	 * FIXME: replace with setElementToEdit()
+	 * @generated
+	 */
+	protected EObject getElementToEdit() {
+		EObject container = ((CreateElementRequest) getRequest()).getContainer();
+		if (container instanceof View) {
+			container = ((View) container).getElement();
+		}
+		return container;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean canExecute() {
+		return true;
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		Rhombus newElement = LinklfFactory.eINSTANCE.createRhombus();
+
+		CanvasElementContainer owner = (CanvasElementContainer) getElementToEdit();
+		owner.getElements().add(newElement);
+
+		doConfigure(newElement, monitor, info);
+
+		((CreateElementRequest) getRequest()).setNewElement(newElement);
+		return CommandResult.newOKCommandResult(newElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doConfigure(Rhombus newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IElementType elementType = ((CreateElementRequest) getRequest()).getElementType();
+		ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
+		configureRequest.setClientContext(((CreateElementRequest) getRequest()).getClientContext());
+		configureRequest.addParameters(getRequest().getParameters());
+		ICommand configureCommand = elementType.getEditCommand(configureRequest);
+		if (configureCommand != null && configureCommand.canExecute()) {
+			configureCommand.execute(monitor, info);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/CanvasEditHelper.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/CanvasEditHelper.java
new file mode 100644
index 0000000..b8fd04e
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/CanvasEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers;
+
+/**
+ * @generated
+ */
+public class CanvasEditHelper extends LinklfBaseEditHelper {
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/CircleEditHelper.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/CircleEditHelper.java
new file mode 100644
index 0000000..d013f6e
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/CircleEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers;
+
+/**
+ * @generated
+ */
+public class CircleEditHelper extends LinklfBaseEditHelper {
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/ContainerEditHelper.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/ContainerEditHelper.java
new file mode 100644
index 0000000..392d30b
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/ContainerEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers;
+
+/**
+ * @generated
+ */
+public class ContainerEditHelper extends LinklfBaseEditHelper {
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/LabeledLinkEditHelper.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/LabeledLinkEditHelper.java
new file mode 100644
index 0000000..e7e1dd6
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/LabeledLinkEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers;
+
+/**
+ * @generated
+ */
+public class LabeledLinkEditHelper extends LinklfBaseEditHelper {
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/LinkEditHelper.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/LinkEditHelper.java
new file mode 100644
index 0000000..efd46b9
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/LinkEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers;
+
+/**
+ * @generated
+ */
+public class LinkEditHelper extends LinklfBaseEditHelper {
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/LinklfBaseEditHelper.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/LinklfBaseEditHelper.java
new file mode 100644
index 0000000..f9e829f
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/LinklfBaseEditHelper.java
@@ -0,0 +1,10 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers;
+
+import org.eclipse.gmf.tooling.runtime.edit.helpers.GeneratedEditHelperBase;
+
+/**
+ * @generated
+ */
+public class LinklfBaseEditHelper extends GeneratedEditHelperBase {
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/PortEditHelper.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/PortEditHelper.java
new file mode 100644
index 0000000..5df1ce4
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/PortEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers;
+
+/**
+ * @generated
+ */
+public class PortEditHelper extends LinklfBaseEditHelper {
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/RectangleEditHelper.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/RectangleEditHelper.java
new file mode 100644
index 0000000..1929242
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/RectangleEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers;
+
+/**
+ * @generated
+ */
+public class RectangleEditHelper extends LinklfBaseEditHelper {
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/RhombusEditHelper.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/RhombusEditHelper.java
new file mode 100644
index 0000000..ae5fa96
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/helpers/RhombusEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.helpers;
+
+/**
+ * @generated
+ */
+public class RhombusEditHelper extends LinklfBaseEditHelper {
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/CanvasEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/CanvasEditPart.java
new file mode 100644
index 0000000..e91aecf
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/CanvasEditPart.java
@@ -0,0 +1,44 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.CanvasCanonicalEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.CanvasItemSemanticEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.runtime.edit.policies.reparent.CreationEditPolicyWithCustomReparent;
+
+/**
+ * @generated
+ */
+public class CanvasEditPart extends DiagramEditPart {
+
+	/**
+	 * @generated
+	 */
+	public final static String MODEL_ID = "linklf"; //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 1000;
+
+	/**
+	 * @generated
+	 */
+	public CanvasEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new CanvasItemSemanticEditPolicy());
+		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE, new CanvasCanonicalEditPolicy());
+		installEditPolicy(EditPolicyRoles.CREATION_ROLE, new CreationEditPolicyWithCustomReparent(LinklfVisualIDRegistry.TYPED_INSTANCE));
+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.POPUPBAR_ROLE);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Circle2EditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Circle2EditPart.java
new file mode 100644
index 0000000..75410db
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Circle2EditPart.java
@@ -0,0 +1,197 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Ellipse;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Shape;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.Circle2ItemSemanticEditPolicy;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @generated
+ */
+public class Circle2EditPart extends ShapeNodeEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 3001;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure contentPane;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure primaryShape;
+
+	/**
+	 * @generated
+	 */
+	public Circle2EditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new Circle2ItemSemanticEditPolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies
+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected LayoutEditPolicy createLayoutEditPolicy() {
+		org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy lep = new org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy() {
+
+			protected EditPolicy createChildEditPolicy(EditPart child) {
+				EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
+				if (result == null) {
+					result = new NonResizableEditPolicy();
+				}
+				return result;
+			}
+
+			protected Command getMoveChildrenCommand(Request request) {
+				return null;
+			}
+
+			protected Command getCreateCommand(CreateRequest request) {
+				return null;
+			}
+		};
+		return lep;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createNodeShape() {
+		return primaryShape = new CircleFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public CircleFigure getPrimaryShape() {
+		return (CircleFigure) primaryShape;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected NodeFigure createNodePlate() {
+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);
+		return result;
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected NodeFigure createNodeFigure() {
+		NodeFigure figure = createNodePlate();
+		figure.setLayoutManager(new StackLayout());
+		IFigure shape = createNodeShape();
+		figure.add(shape);
+		contentPane = setupContentPane(shape);
+		return figure;
+	}
+
+	/**
+	 * Default implementation treats passed figure as content pane.
+	 * Respects layout one may have set for generated figure.
+	 * @param nodeShape instance of generated figure class
+	 * @generated
+	 */
+	protected IFigure setupContentPane(IFigure nodeShape) {
+		return nodeShape; // use nodeShape itself as contentPane
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure getContentPane() {
+		if (contentPane != null) {
+			return contentPane;
+		}
+		return super.getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setForegroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setForegroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setBackgroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setBackgroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineWidth(int width) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineWidth(width);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineType(int style) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineStyle(style);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public class CircleFigure extends Ellipse {
+
+		/**
+		 * @generated
+		 */
+		public CircleFigure() {
+			this.setLayoutManager(new StackLayout());
+			this.setLineWidth(2);
+			this.setForegroundColor(ColorConstants.lightBlue);
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/CircleEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/CircleEditPart.java
new file mode 100644
index 0000000..d163b89
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/CircleEditPart.java
@@ -0,0 +1,197 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Ellipse;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Shape;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.CircleItemSemanticEditPolicy;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @generated
+ */
+public class CircleEditPart extends ShapeNodeEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 2001;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure contentPane;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure primaryShape;
+
+	/**
+	 * @generated
+	 */
+	public CircleEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new CircleItemSemanticEditPolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies
+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected LayoutEditPolicy createLayoutEditPolicy() {
+		org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy lep = new org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy() {
+
+			protected EditPolicy createChildEditPolicy(EditPart child) {
+				EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
+				if (result == null) {
+					result = new NonResizableEditPolicy();
+				}
+				return result;
+			}
+
+			protected Command getMoveChildrenCommand(Request request) {
+				return null;
+			}
+
+			protected Command getCreateCommand(CreateRequest request) {
+				return null;
+			}
+		};
+		return lep;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createNodeShape() {
+		return primaryShape = new CircleFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public CircleFigure getPrimaryShape() {
+		return (CircleFigure) primaryShape;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected NodeFigure createNodePlate() {
+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);
+		return result;
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected NodeFigure createNodeFigure() {
+		NodeFigure figure = createNodePlate();
+		figure.setLayoutManager(new StackLayout());
+		IFigure shape = createNodeShape();
+		figure.add(shape);
+		contentPane = setupContentPane(shape);
+		return figure;
+	}
+
+	/**
+	 * Default implementation treats passed figure as content pane.
+	 * Respects layout one may have set for generated figure.
+	 * @param nodeShape instance of generated figure class
+	 * @generated
+	 */
+	protected IFigure setupContentPane(IFigure nodeShape) {
+		return nodeShape; // use nodeShape itself as contentPane
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure getContentPane() {
+		if (contentPane != null) {
+			return contentPane;
+		}
+		return super.getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setForegroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setForegroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setBackgroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setBackgroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineWidth(int width) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineWidth(width);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineType(int style) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineStyle(style);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public class CircleFigure extends Ellipse {
+
+		/**
+		 * @generated
+		 */
+		public CircleFigure() {
+			this.setLayoutManager(new StackLayout());
+			this.setLineWidth(2);
+			this.setForegroundColor(ColorConstants.lightBlue);
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Container2EditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Container2EditPart.java
new file mode 100644
index 0000000..8a3778b
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Container2EditPart.java
@@ -0,0 +1,338 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.BorderLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.Shape;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderedShapeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.BorderItemSelectionEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ConstrainedToolbarLayoutEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemLocator;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.Container2CanonicalEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.Container2ItemSemanticEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfTextSelectionEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.runtime.edit.policies.reparent.CreationEditPolicyWithCustomReparent;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @generated
+ */
+public class Container2EditPart extends AbstractBorderedShapeEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 3002;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure contentPane;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure primaryShape;
+
+	/**
+	 * @generated
+	 */
+	public Container2EditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		installEditPolicy(EditPolicyRoles.CREATION_ROLE, new CreationEditPolicyWithCustomReparent(LinklfVisualIDRegistry.TYPED_INSTANCE));
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new Container2ItemSemanticEditPolicy());
+		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE, new DragDropEditPolicy());
+		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE, new Container2CanonicalEditPolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies
+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected LayoutEditPolicy createLayoutEditPolicy() {
+
+		ConstrainedToolbarLayoutEditPolicy lep = new ConstrainedToolbarLayoutEditPolicy() {
+
+			protected EditPolicy createChildEditPolicy(EditPart child) {
+				View childView = (View) child.getModel();
+				switch (LinklfVisualIDRegistry.getVisualID(childView)) {
+				case PortEditPart.VISUAL_ID:
+					return new BorderItemSelectionEditPolicy();
+				}
+				if (child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE) == null) {
+					if (child instanceof ITextAwareEditPart) {
+						return new LinklfTextSelectionEditPolicy();
+					}
+				}
+				return super.createChildEditPolicy(child);
+			}
+		};
+		return lep;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createNodeShape() {
+		return primaryShape = new ContainerFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public ContainerFigure getPrimaryShape() {
+		return (ContainerFigure) primaryShape;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean addFixedChild(EditPart childEditPart) {
+		if (childEditPart instanceof ContainerName2EditPart) {
+			((ContainerName2EditPart) childEditPart).setLabel(getPrimaryShape().getFigureContainerNameFigure());
+			return true;
+		}
+		if (childEditPart instanceof ContainerContainerCompartment2EditPart) {
+			IFigure pane = getPrimaryShape().getFigureContainerCompartmentFigure();
+			setupContentPane(pane); // FIXME each comparment should handle his content pane in his own way 
+			pane.add(((ContainerContainerCompartment2EditPart) childEditPart).getFigure());
+			return true;
+		}
+		if (childEditPart instanceof PortEditPart) {
+			BorderItemLocator locator = new BorderItemLocator(getMainFigure(), PositionConstants.NONE);
+			getBorderedFigure().getBorderItemContainer().add(((PortEditPart) childEditPart).getFigure(), locator);
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean removeFixedChild(EditPart childEditPart) {
+		if (childEditPart instanceof ContainerName2EditPart) {
+			return true;
+		}
+		if (childEditPart instanceof ContainerContainerCompartment2EditPart) {
+			IFigure pane = getPrimaryShape().getFigureContainerCompartmentFigure();
+			pane.remove(((ContainerContainerCompartment2EditPart) childEditPart).getFigure());
+			return true;
+		}
+		if (childEditPart instanceof PortEditPart) {
+			getBorderedFigure().getBorderItemContainer().remove(((PortEditPart) childEditPart).getFigure());
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void addChildVisual(EditPart childEditPart, int index) {
+		if (addFixedChild(childEditPart)) {
+			return;
+		}
+		super.addChildVisual(childEditPart, -1);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void removeChildVisual(EditPart childEditPart) {
+		if (removeFixedChild(childEditPart)) {
+			return;
+		}
+		super.removeChildVisual(childEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
+		if (editPart instanceof ContainerContainerCompartment2EditPart) {
+			return getPrimaryShape().getFigureContainerCompartmentFigure();
+		}
+		if (editPart instanceof IBorderItemEditPart) {
+			return getBorderedFigure().getBorderItemContainer();
+		}
+		return getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected NodeFigure createNodePlate() {
+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);
+		return result;
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected NodeFigure createMainFigure() {
+		NodeFigure figure = createNodePlate();
+		figure.setLayoutManager(new StackLayout());
+		IFigure shape = createNodeShape();
+		figure.add(shape);
+		contentPane = setupContentPane(shape);
+		return figure;
+	}
+
+	/**
+	 * Default implementation treats passed figure as content pane.
+	 * Respects layout one may have set for generated figure.
+	 * @param nodeShape instance of generated figure class
+	 * @generated
+	 */
+	protected IFigure setupContentPane(IFigure nodeShape) {
+		if (nodeShape.getLayoutManager() == null) {
+			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
+			layout.setSpacing(5);
+			nodeShape.setLayoutManager(layout);
+		}
+		return nodeShape; // use nodeShape itself as contentPane
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure getContentPane() {
+		if (contentPane != null) {
+			return contentPane;
+		}
+		return super.getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setForegroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setForegroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setBackgroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setBackgroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineWidth(int width) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineWidth(width);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineType(int style) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineStyle(style);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public EditPart getPrimaryChildEditPart() {
+		return getChildBySemanticHint(LinklfVisualIDRegistry.getType(ContainerName2EditPart.VISUAL_ID));
+	}
+
+	/**
+	 * @generated
+	 */
+	public class ContainerFigure extends RectangleFigure {
+
+		/**
+		 * @generated
+		 */
+		private RectangleFigure fFigureContainerCompartmentFigure;
+
+		/**
+		 * @generated
+		 */
+		private WrappingLabel fFigureContainerNameFigure;
+
+		/**
+		 * @generated
+		 */
+		public ContainerFigure() {
+
+			BorderLayout layoutThis = new BorderLayout();
+			this.setLayoutManager(layoutThis);
+
+			createContents();
+		}
+
+		/**
+		 * @generated
+		 */
+		private void createContents() {
+
+			fFigureContainerNameFigure = new WrappingLabel();
+
+			fFigureContainerNameFigure.setText("<...>");
+
+			this.add(fFigureContainerNameFigure, BorderLayout.TOP);
+
+			fFigureContainerCompartmentFigure = new RectangleFigure();
+
+			this.add(fFigureContainerCompartmentFigure, BorderLayout.CENTER);
+
+		}
+
+		/**
+		 * @generated
+		 */
+		public RectangleFigure getFigureContainerCompartmentFigure() {
+			return fFigureContainerCompartmentFigure;
+		}
+
+		/**
+		 * @generated
+		 */
+		public WrappingLabel getFigureContainerNameFigure() {
+			return fFigureContainerNameFigure;
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerContainerCompartment2EditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerContainerCompartment2EditPart.java
new file mode 100644
index 0000000..0df13f2
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerContainerCompartment2EditPart.java
@@ -0,0 +1,111 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gmf.runtime.diagram.core.edithelpers.CreateElementRequestAdapter;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeCompartmentEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateUnspecifiedTypeConnectionRequest;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewAndElementRequest;
+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.ContainerContainerCompartment2CanonicalEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.ContainerContainerCompartment2ItemSemanticEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.Messages;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.runtime.edit.policies.reparent.CreationEditPolicyWithCustomReparent;
+
+/**
+ * @generated
+ */
+public class ContainerContainerCompartment2EditPart extends ShapeCompartmentEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 7002;
+
+	/**
+	 * @generated
+	 */
+	public ContainerContainerCompartment2EditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getCompartmentName() {
+		return Messages.ContainerContainerCompartment2EditPart_title;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure createFigure() {
+		ResizableCompartmentFigure result = (ResizableCompartmentFigure) super.createFigure();
+		result.setTitleVisibility(false);
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new ContainerContainerCompartment2ItemSemanticEditPolicy());
+		installEditPolicy(EditPolicyRoles.CREATION_ROLE, new CreationEditPolicyWithCustomReparent(LinklfVisualIDRegistry.TYPED_INSTANCE));
+		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE, new DragDropEditPolicy());
+		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE, new ContainerContainerCompartment2CanonicalEditPolicy());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setRatio(Double ratio) {
+		// nothing to do -- parent layout does not accept Double constraints as ratio
+		// super.setRatio(ratio); 
+	}
+
+	/**
+	 * @generated
+	 */
+	public EditPart getTargetEditPart(Request request) {
+		if (request instanceof CreateViewAndElementRequest) {
+			CreateElementRequestAdapter adapter = ((CreateViewAndElementRequest) request).getViewAndElementDescriptor().getCreateElementRequestAdapter();
+			IElementType type = (IElementType) adapter.getAdapter(IElementType.class);
+			if (type == LinklfElementTypes.Circle_3001) {
+				return this;
+			}
+			if (type == LinklfElementTypes.Container_3002) {
+				return this;
+			}
+			if (type == LinklfElementTypes.Rectangle_3003) {
+				return this;
+			}
+			if (type == LinklfElementTypes.Rhombus_3004) {
+				return this;
+			}
+			return getParent().getTargetEditPart(request);
+		}
+		if (request instanceof CreateUnspecifiedTypeConnectionRequest) {
+			if (RequestConstants.REQ_CONNECTION_END.equals(request.getType())) {
+				for (Object type : ((CreateUnspecifiedTypeConnectionRequest) request).getElementTypes()) {
+					if (type instanceof IElementType) {
+						IElementType elementType = (IElementType) type;
+						if (elementType.equals(LinklfElementTypes.Link_4001) || elementType.equals(LinklfElementTypes.LabeledLink_4002))
+							return super.getTargetEditPart(request);
+					}
+				}
+			}
+			return getParent().getTargetEditPart(request);
+		}
+		return super.getTargetEditPart(request);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerContainerCompartmentEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerContainerCompartmentEditPart.java
new file mode 100644
index 0000000..b88c951
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerContainerCompartmentEditPart.java
@@ -0,0 +1,111 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gmf.runtime.diagram.core.edithelpers.CreateElementRequestAdapter;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeCompartmentEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateUnspecifiedTypeConnectionRequest;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewAndElementRequest;
+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.ContainerContainerCompartmentCanonicalEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.ContainerContainerCompartmentItemSemanticEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.Messages;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.runtime.edit.policies.reparent.CreationEditPolicyWithCustomReparent;
+
+/**
+ * @generated
+ */
+public class ContainerContainerCompartmentEditPart extends ShapeCompartmentEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 7001;
+
+	/**
+	 * @generated
+	 */
+	public ContainerContainerCompartmentEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getCompartmentName() {
+		return Messages.ContainerContainerCompartmentEditPart_title;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure createFigure() {
+		ResizableCompartmentFigure result = (ResizableCompartmentFigure) super.createFigure();
+		result.setTitleVisibility(false);
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new ContainerContainerCompartmentItemSemanticEditPolicy());
+		installEditPolicy(EditPolicyRoles.CREATION_ROLE, new CreationEditPolicyWithCustomReparent(LinklfVisualIDRegistry.TYPED_INSTANCE));
+		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE, new DragDropEditPolicy());
+		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE, new ContainerContainerCompartmentCanonicalEditPolicy());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setRatio(Double ratio) {
+		// nothing to do -- parent layout does not accept Double constraints as ratio
+		// super.setRatio(ratio); 
+	}
+
+	/**
+	 * @generated
+	 */
+	public EditPart getTargetEditPart(Request request) {
+		if (request instanceof CreateViewAndElementRequest) {
+			CreateElementRequestAdapter adapter = ((CreateViewAndElementRequest) request).getViewAndElementDescriptor().getCreateElementRequestAdapter();
+			IElementType type = (IElementType) adapter.getAdapter(IElementType.class);
+			if (type == LinklfElementTypes.Circle_3001) {
+				return this;
+			}
+			if (type == LinklfElementTypes.Container_3002) {
+				return this;
+			}
+			if (type == LinklfElementTypes.Rectangle_3003) {
+				return this;
+			}
+			if (type == LinklfElementTypes.Rhombus_3004) {
+				return this;
+			}
+			return getParent().getTargetEditPart(request);
+		}
+		if (request instanceof CreateUnspecifiedTypeConnectionRequest) {
+			if (RequestConstants.REQ_CONNECTION_END.equals(request.getType())) {
+				for (Object type : ((CreateUnspecifiedTypeConnectionRequest) request).getElementTypes()) {
+					if (type instanceof IElementType) {
+						IElementType elementType = (IElementType) type;
+						if (elementType.equals(LinklfElementTypes.Link_4001) || elementType.equals(LinklfElementTypes.LabeledLink_4002))
+							return super.getTargetEditPart(request);
+					}
+				}
+			}
+			return getParent().getTargetEditPart(request);
+		}
+		return super.getTargetEditPart(request);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerEditPart.java
new file mode 100644
index 0000000..461b88a
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerEditPart.java
@@ -0,0 +1,338 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.BorderLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.Shape;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderedShapeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.BorderItemSelectionEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ConstrainedToolbarLayoutEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemLocator;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.ContainerCanonicalEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.ContainerItemSemanticEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfTextSelectionEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.runtime.edit.policies.reparent.CreationEditPolicyWithCustomReparent;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @generated
+ */
+public class ContainerEditPart extends AbstractBorderedShapeEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 2003;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure contentPane;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure primaryShape;
+
+	/**
+	 * @generated
+	 */
+	public ContainerEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		installEditPolicy(EditPolicyRoles.CREATION_ROLE, new CreationEditPolicyWithCustomReparent(LinklfVisualIDRegistry.TYPED_INSTANCE));
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new ContainerItemSemanticEditPolicy());
+		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE, new DragDropEditPolicy());
+		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE, new ContainerCanonicalEditPolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies
+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected LayoutEditPolicy createLayoutEditPolicy() {
+
+		ConstrainedToolbarLayoutEditPolicy lep = new ConstrainedToolbarLayoutEditPolicy() {
+
+			protected EditPolicy createChildEditPolicy(EditPart child) {
+				View childView = (View) child.getModel();
+				switch (LinklfVisualIDRegistry.getVisualID(childView)) {
+				case PortEditPart.VISUAL_ID:
+					return new BorderItemSelectionEditPolicy();
+				}
+				if (child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE) == null) {
+					if (child instanceof ITextAwareEditPart) {
+						return new LinklfTextSelectionEditPolicy();
+					}
+				}
+				return super.createChildEditPolicy(child);
+			}
+		};
+		return lep;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createNodeShape() {
+		return primaryShape = new ContainerFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public ContainerFigure getPrimaryShape() {
+		return (ContainerFigure) primaryShape;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean addFixedChild(EditPart childEditPart) {
+		if (childEditPart instanceof ContainerNameEditPart) {
+			((ContainerNameEditPart) childEditPart).setLabel(getPrimaryShape().getFigureContainerNameFigure());
+			return true;
+		}
+		if (childEditPart instanceof ContainerContainerCompartmentEditPart) {
+			IFigure pane = getPrimaryShape().getFigureContainerCompartmentFigure();
+			setupContentPane(pane); // FIXME each comparment should handle his content pane in his own way 
+			pane.add(((ContainerContainerCompartmentEditPart) childEditPart).getFigure());
+			return true;
+		}
+		if (childEditPart instanceof PortEditPart) {
+			BorderItemLocator locator = new BorderItemLocator(getMainFigure(), PositionConstants.NONE);
+			getBorderedFigure().getBorderItemContainer().add(((PortEditPart) childEditPart).getFigure(), locator);
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean removeFixedChild(EditPart childEditPart) {
+		if (childEditPart instanceof ContainerNameEditPart) {
+			return true;
+		}
+		if (childEditPart instanceof ContainerContainerCompartmentEditPart) {
+			IFigure pane = getPrimaryShape().getFigureContainerCompartmentFigure();
+			pane.remove(((ContainerContainerCompartmentEditPart) childEditPart).getFigure());
+			return true;
+		}
+		if (childEditPart instanceof PortEditPart) {
+			getBorderedFigure().getBorderItemContainer().remove(((PortEditPart) childEditPart).getFigure());
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void addChildVisual(EditPart childEditPart, int index) {
+		if (addFixedChild(childEditPart)) {
+			return;
+		}
+		super.addChildVisual(childEditPart, -1);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void removeChildVisual(EditPart childEditPart) {
+		if (removeFixedChild(childEditPart)) {
+			return;
+		}
+		super.removeChildVisual(childEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
+		if (editPart instanceof ContainerContainerCompartmentEditPart) {
+			return getPrimaryShape().getFigureContainerCompartmentFigure();
+		}
+		if (editPart instanceof IBorderItemEditPart) {
+			return getBorderedFigure().getBorderItemContainer();
+		}
+		return getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected NodeFigure createNodePlate() {
+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);
+		return result;
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected NodeFigure createMainFigure() {
+		NodeFigure figure = createNodePlate();
+		figure.setLayoutManager(new StackLayout());
+		IFigure shape = createNodeShape();
+		figure.add(shape);
+		contentPane = setupContentPane(shape);
+		return figure;
+	}
+
+	/**
+	 * Default implementation treats passed figure as content pane.
+	 * Respects layout one may have set for generated figure.
+	 * @param nodeShape instance of generated figure class
+	 * @generated
+	 */
+	protected IFigure setupContentPane(IFigure nodeShape) {
+		if (nodeShape.getLayoutManager() == null) {
+			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
+			layout.setSpacing(5);
+			nodeShape.setLayoutManager(layout);
+		}
+		return nodeShape; // use nodeShape itself as contentPane
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure getContentPane() {
+		if (contentPane != null) {
+			return contentPane;
+		}
+		return super.getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setForegroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setForegroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setBackgroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setBackgroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineWidth(int width) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineWidth(width);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineType(int style) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineStyle(style);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public EditPart getPrimaryChildEditPart() {
+		return getChildBySemanticHint(LinklfVisualIDRegistry.getType(ContainerNameEditPart.VISUAL_ID));
+	}
+
+	/**
+	 * @generated
+	 */
+	public class ContainerFigure extends RectangleFigure {
+
+		/**
+		 * @generated
+		 */
+		private RectangleFigure fFigureContainerCompartmentFigure;
+
+		/**
+		 * @generated
+		 */
+		private WrappingLabel fFigureContainerNameFigure;
+
+		/**
+		 * @generated
+		 */
+		public ContainerFigure() {
+
+			BorderLayout layoutThis = new BorderLayout();
+			this.setLayoutManager(layoutThis);
+
+			createContents();
+		}
+
+		/**
+		 * @generated
+		 */
+		private void createContents() {
+
+			fFigureContainerNameFigure = new WrappingLabel();
+
+			fFigureContainerNameFigure.setText("<...>");
+
+			this.add(fFigureContainerNameFigure, BorderLayout.TOP);
+
+			fFigureContainerCompartmentFigure = new RectangleFigure();
+
+			this.add(fFigureContainerCompartmentFigure, BorderLayout.CENTER);
+
+		}
+
+		/**
+		 * @generated
+		 */
+		public RectangleFigure getFigureContainerCompartmentFigure() {
+			return fFigureContainerCompartmentFigure;
+		}
+
+		/**
+		 * @generated
+		 */
+		public WrappingLabel getFigureContainerNameFigure() {
+			return fFigureContainerNameFigure;
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerName2EditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerName2EditPart.java
new file mode 100644
index 0000000..71ca054
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerName2EditPart.java
@@ -0,0 +1,580 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RunnableWithResult;
+import org.eclipse.gef.AccessibleEditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.gef.tools.DirectEditManager;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
+import org.eclipse.gmf.runtime.diagram.ui.label.ILabelDelegate;
+import org.eclipse.gmf.runtime.diagram.ui.label.WrappingLabelDelegate;
+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
+import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
+import org.eclipse.gmf.runtime.notation.FontStyle;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfTextSelectionEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfParserProvider;
+import org.eclipse.gmf.tooling.runtime.draw2d.labels.SimpleLabelDelegate;
+import org.eclipse.gmf.tooling.runtime.edit.policies.DefaultNodeLabelDragPolicy;
+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.viewers.ICellEditorValidator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @generated
+ */
+public class ContainerName2EditPart extends CompartmentEditPart implements ITextAwareEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 5001;
+
+	/**
+	 * @generated
+	 */
+	private DirectEditManager manager;
+
+	/**
+	 * @generated
+	 */
+	private IParser parser;
+
+	/**
+	 * @generated
+	 */
+	private List<?> parserElements;
+
+	/**
+	 * @generated
+	 */
+	private String defaultText;
+
+	/**
+	 * @generated
+	 */
+	private ILabelDelegate labelDelegate;
+
+	/**
+	 * @generated
+	 */
+	public ContainerName2EditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new LinklfTextSelectionEditPolicy());
+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy());
+		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DefaultNodeLabelDragPolicy());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getLabelTextHelper(IFigure figure) {
+		if (figure instanceof WrappingLabel) {
+			return ((WrappingLabel) figure).getText();
+		} else if (figure instanceof Label) {
+			return ((Label) figure).getText();
+		} else {
+			return getLabelDelegate().getText();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLabelTextHelper(IFigure figure, String text) {
+		if (figure instanceof WrappingLabel) {
+			((WrappingLabel) figure).setText(text);
+		} else if (figure instanceof Label) {
+			((Label) figure).setText(text);
+		} else {
+			getLabelDelegate().setText(text);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Image getLabelIconHelper(IFigure figure) {
+		if (figure instanceof WrappingLabel) {
+			return ((WrappingLabel) figure).getIcon();
+		} else if (figure instanceof Label) {
+			return ((Label) figure).getIcon();
+		} else {
+			return getLabelDelegate().getIcon(0);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLabelIconHelper(IFigure figure, Image icon) {
+		if (figure instanceof WrappingLabel) {
+			((WrappingLabel) figure).setIcon(icon);
+			return;
+		} else if (figure instanceof Label) {
+			((Label) figure).setIcon(icon);
+			return;
+		} else {
+			getLabelDelegate().setIcon(icon, 0);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLabel(WrappingLabel figure) {
+		unregisterVisuals();
+		setFigure(figure);
+		defaultText = getLabelTextHelper(figure);
+		registerVisuals();
+		refreshVisuals();
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	protected List getModelChildren() {
+		return Collections.EMPTY_LIST;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EObject getParserElement() {
+		return resolveSemanticElement();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Image getLabelIcon() {
+		EObject parserElement = getParserElement();
+		if (parserElement == null) {
+			return null;
+		}
+		return LinklfElementTypes.getImage(parserElement.eClass());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getLabelText() {
+		String text = null;
+		EObject parserElement = getParserElement();
+		if (parserElement != null && getParser() != null) {
+			text = getParser().getPrintString(new EObjectAdapter(parserElement), getParserOptions().intValue());
+		}
+		if (text == null || text.length() == 0) {
+			text = defaultText;
+		}
+		return text;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLabelText(String text) {
+		setLabelTextHelper(getFigure(), text);
+		refreshSelectionFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getEditText() {
+		if (getParserElement() == null || getParser() == null) {
+			return ""; //$NON-NLS-1$
+		}
+		return getParser().getEditString(new EObjectAdapter(getParserElement()), getParserOptions().intValue());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isEditable() {
+		return getParser() != null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public ICellEditorValidator getEditTextValidator() {
+		return new ICellEditorValidator() {
+
+			public String isValid(final Object value) {
+				if (value instanceof String) {
+					final EObject element = getParserElement();
+					final IParser parser = getParser();
+					try {
+						IParserEditStatus valid = (IParserEditStatus) getEditingDomain().runExclusive(new RunnableWithResult.Impl<IParserEditStatus>() {
+
+							public void run() {
+								setResult(parser.isValidEditString(new EObjectAdapter(element), (String) value));
+							}
+						});
+						return valid.getCode() == ParserEditStatus.EDITABLE ? null : valid.getMessage();
+					} catch (InterruptedException ie) {
+						ie.printStackTrace();
+					}
+				}
+
+				// shouldn't get here
+				return null;
+			}
+		};
+	}
+
+	/**
+	 * @generated
+	 */
+	public IContentAssistProcessor getCompletionProcessor() {
+		if (getParserElement() == null || getParser() == null) {
+			return null;
+		}
+		return getParser().getCompletionProcessor(new EObjectAdapter(getParserElement()));
+	}
+
+	/**
+	 * @generated
+	 */
+	public ParserOptions getParserOptions() {
+		return ParserOptions.NONE;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IParser getParser() {
+		if (parser == null) {
+			parser = LinklfParserProvider.getParser(LinklfElementTypes.Container_3002, getParserElement(),
+					LinklfVisualIDRegistry.getType(org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerName2EditPart.VISUAL_ID));
+		}
+		return parser;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected DirectEditManager getManager() {
+		if (manager == null) {
+			setManager(new TextDirectEditManager(this, null, LinklfEditPartFactory.getTextCellEditorLocator(this)));
+		}
+		return manager;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setManager(DirectEditManager manager) {
+		this.manager = manager;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEdit() {
+		getManager().show();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEdit(Point eventLocation) {
+		if (getManager().getClass() == TextDirectEditManager.class) {
+			((TextDirectEditManager) getManager()).show(eventLocation.getSWTPoint());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void performDirectEdit(char initialCharacter) {
+		if (getManager() instanceof TextDirectEditManager) {
+			((TextDirectEditManager) getManager()).show(initialCharacter);
+		} else //
+		{
+			performDirectEdit();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEditRequest(Request request) {
+		final Request theRequest = request;
+		try {
+			getEditingDomain().runExclusive(new Runnable() {
+
+				public void run() {
+					if (isActive() && isEditable()) {
+						if (theRequest.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
+							Character initialChar = (Character) theRequest.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
+							performDirectEdit(initialChar.charValue());
+						} else if ((theRequest instanceof DirectEditRequest) && (getEditText().equals(getLabelText()))) {
+							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
+							performDirectEdit(editRequest.getLocation());
+						} else {
+							performDirectEdit();
+						}
+					}
+				}
+			});
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshVisuals() {
+		super.refreshVisuals();
+		refreshLabel();
+		refreshFont();
+		refreshFontColor();
+		refreshUnderline();
+		refreshStrikeThrough();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshLabel() {
+		setLabelTextHelper(getFigure(), getLabelText());
+		setLabelIconHelper(getFigure(), getLabelIcon());
+		refreshSelectionFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshUnderline() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null && getFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshStrikeThrough() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null && getFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getFigure()).setTextStrikeThrough(style.isStrikeThrough());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshFont() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null) {
+			FontData fontData = new FontData(style.getFontName(), style.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL) | (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
+			setFont(fontData);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void refreshSelectionFeedback() {
+		requestEditPolicyFeedbackRefresh(EditPolicy.PRIMARY_DRAG_ROLE);
+		requestEditPolicyFeedbackRefresh(EditPolicy.SELECTION_FEEDBACK_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	private void requestEditPolicyFeedbackRefresh(String editPolicyKey) {
+		Object editPolicy = getEditPolicy(editPolicyKey);
+		if (editPolicy instanceof IRefreshableFeedbackEditPolicy) {
+			((IRefreshableFeedbackEditPolicy) editPolicy).refreshFeedback();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setFontColor(Color color) {
+		getFigure().setForegroundColor(color);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void addSemanticListeners() {
+		if (getParser() instanceof ISemanticParser) {
+			EObject element = resolveSemanticElement();
+			parserElements = ((ISemanticParser) getParser()).getSemanticElementsBeingParsed(element);
+			for (int i = 0; i < parserElements.size(); i++) {
+				addListenerFilter("SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
+			}
+		} else {
+			super.addSemanticListeners();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void removeSemanticListeners() {
+		if (parserElements != null) {
+			for (int i = 0; i < parserElements.size(); i++) {
+				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
+			}
+		} else {
+			super.removeSemanticListeners();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected AccessibleEditPart getAccessibleEditPart() {
+		if (accessibleEP == null) {
+			accessibleEP = new AccessibleGraphicalEditPart() {
+
+				public void getName(AccessibleEvent e) {
+					e.result = getLabelTextHelper(getFigure());
+				}
+			};
+		}
+		return accessibleEP;
+	}
+
+	/**
+	 * @generated
+	 */
+	private View getFontStyleOwnerView() {
+		return getPrimaryView();
+	}
+
+	/**
+	 * @generated
+	 */
+	private ILabelDelegate getLabelDelegate() {
+		if (labelDelegate == null) {
+			IFigure label = getFigure();
+			if (label instanceof WrappingLabel) {
+				labelDelegate = new WrappingLabelDelegate((WrappingLabel) label);
+			} else {
+				labelDelegate = new SimpleLabelDelegate((Label) label);
+			}
+		}
+		return labelDelegate;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public Object getAdapter(Class key) {
+		if (ILabelDelegate.class.equals(key)) {
+			return getLabelDelegate();
+		}
+		return super.getAdapter(key);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void addNotationalListeners() {
+		super.addNotationalListeners();
+		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void removeNotationalListeners() {
+		super.removeNotationalListeners();
+		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void handleNotificationEvent(Notification event) {
+		Object feature = event.getFeature();
+		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
+			Integer c = (Integer) event.getNewValue();
+			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
+		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(feature)) {
+			refreshUnderline();
+		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough().equals(feature)) {
+			refreshStrikeThrough();
+		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(feature) || NotationPackage.eINSTANCE.getFontStyle_FontName().equals(feature)
+				|| NotationPackage.eINSTANCE.getFontStyle_Bold().equals(feature) || NotationPackage.eINSTANCE.getFontStyle_Italic().equals(feature)) {
+			refreshFont();
+		} else {
+			if (getParser() != null && getParser().isAffectingEvent(event, getParserOptions().intValue())) {
+				refreshLabel();
+			}
+			if (getParser() instanceof ISemanticParser) {
+				ISemanticParser modelParser = (ISemanticParser) getParser();
+				if (modelParser.areSemanticElementsAffected(null, event)) {
+					removeSemanticListeners();
+					if (resolveSemanticElement() != null) {
+						addSemanticListeners();
+					}
+					refreshLabel();
+				}
+			}
+		}
+		super.handleNotificationEvent(event);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createFigure() {
+		// Parent should assign one using setLabel() method
+		return null;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerNameEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerNameEditPart.java
new file mode 100644
index 0000000..f01377e
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/ContainerNameEditPart.java
@@ -0,0 +1,580 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RunnableWithResult;
+import org.eclipse.gef.AccessibleEditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.gef.tools.DirectEditManager;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
+import org.eclipse.gmf.runtime.diagram.ui.label.ILabelDelegate;
+import org.eclipse.gmf.runtime.diagram.ui.label.WrappingLabelDelegate;
+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
+import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
+import org.eclipse.gmf.runtime.notation.FontStyle;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfTextSelectionEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfParserProvider;
+import org.eclipse.gmf.tooling.runtime.draw2d.labels.SimpleLabelDelegate;
+import org.eclipse.gmf.tooling.runtime.edit.policies.DefaultNodeLabelDragPolicy;
+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.viewers.ICellEditorValidator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @generated
+ */
+public class ContainerNameEditPart extends CompartmentEditPart implements ITextAwareEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 5002;
+
+	/**
+	 * @generated
+	 */
+	private DirectEditManager manager;
+
+	/**
+	 * @generated
+	 */
+	private IParser parser;
+
+	/**
+	 * @generated
+	 */
+	private List<?> parserElements;
+
+	/**
+	 * @generated
+	 */
+	private String defaultText;
+
+	/**
+	 * @generated
+	 */
+	private ILabelDelegate labelDelegate;
+
+	/**
+	 * @generated
+	 */
+	public ContainerNameEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new LinklfTextSelectionEditPolicy());
+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy());
+		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DefaultNodeLabelDragPolicy());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getLabelTextHelper(IFigure figure) {
+		if (figure instanceof WrappingLabel) {
+			return ((WrappingLabel) figure).getText();
+		} else if (figure instanceof Label) {
+			return ((Label) figure).getText();
+		} else {
+			return getLabelDelegate().getText();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLabelTextHelper(IFigure figure, String text) {
+		if (figure instanceof WrappingLabel) {
+			((WrappingLabel) figure).setText(text);
+		} else if (figure instanceof Label) {
+			((Label) figure).setText(text);
+		} else {
+			getLabelDelegate().setText(text);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Image getLabelIconHelper(IFigure figure) {
+		if (figure instanceof WrappingLabel) {
+			return ((WrappingLabel) figure).getIcon();
+		} else if (figure instanceof Label) {
+			return ((Label) figure).getIcon();
+		} else {
+			return getLabelDelegate().getIcon(0);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLabelIconHelper(IFigure figure, Image icon) {
+		if (figure instanceof WrappingLabel) {
+			((WrappingLabel) figure).setIcon(icon);
+			return;
+		} else if (figure instanceof Label) {
+			((Label) figure).setIcon(icon);
+			return;
+		} else {
+			getLabelDelegate().setIcon(icon, 0);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLabel(WrappingLabel figure) {
+		unregisterVisuals();
+		setFigure(figure);
+		defaultText = getLabelTextHelper(figure);
+		registerVisuals();
+		refreshVisuals();
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	protected List getModelChildren() {
+		return Collections.EMPTY_LIST;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EObject getParserElement() {
+		return resolveSemanticElement();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Image getLabelIcon() {
+		EObject parserElement = getParserElement();
+		if (parserElement == null) {
+			return null;
+		}
+		return LinklfElementTypes.getImage(parserElement.eClass());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getLabelText() {
+		String text = null;
+		EObject parserElement = getParserElement();
+		if (parserElement != null && getParser() != null) {
+			text = getParser().getPrintString(new EObjectAdapter(parserElement), getParserOptions().intValue());
+		}
+		if (text == null || text.length() == 0) {
+			text = defaultText;
+		}
+		return text;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLabelText(String text) {
+		setLabelTextHelper(getFigure(), text);
+		refreshSelectionFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getEditText() {
+		if (getParserElement() == null || getParser() == null) {
+			return ""; //$NON-NLS-1$
+		}
+		return getParser().getEditString(new EObjectAdapter(getParserElement()), getParserOptions().intValue());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isEditable() {
+		return getParser() != null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public ICellEditorValidator getEditTextValidator() {
+		return new ICellEditorValidator() {
+
+			public String isValid(final Object value) {
+				if (value instanceof String) {
+					final EObject element = getParserElement();
+					final IParser parser = getParser();
+					try {
+						IParserEditStatus valid = (IParserEditStatus) getEditingDomain().runExclusive(new RunnableWithResult.Impl<IParserEditStatus>() {
+
+							public void run() {
+								setResult(parser.isValidEditString(new EObjectAdapter(element), (String) value));
+							}
+						});
+						return valid.getCode() == ParserEditStatus.EDITABLE ? null : valid.getMessage();
+					} catch (InterruptedException ie) {
+						ie.printStackTrace();
+					}
+				}
+
+				// shouldn't get here
+				return null;
+			}
+		};
+	}
+
+	/**
+	 * @generated
+	 */
+	public IContentAssistProcessor getCompletionProcessor() {
+		if (getParserElement() == null || getParser() == null) {
+			return null;
+		}
+		return getParser().getCompletionProcessor(new EObjectAdapter(getParserElement()));
+	}
+
+	/**
+	 * @generated
+	 */
+	public ParserOptions getParserOptions() {
+		return ParserOptions.NONE;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IParser getParser() {
+		if (parser == null) {
+			parser = LinklfParserProvider.getParser(LinklfElementTypes.Container_2003, getParserElement(),
+					LinklfVisualIDRegistry.getType(org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerNameEditPart.VISUAL_ID));
+		}
+		return parser;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected DirectEditManager getManager() {
+		if (manager == null) {
+			setManager(new TextDirectEditManager(this, null, LinklfEditPartFactory.getTextCellEditorLocator(this)));
+		}
+		return manager;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setManager(DirectEditManager manager) {
+		this.manager = manager;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEdit() {
+		getManager().show();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEdit(Point eventLocation) {
+		if (getManager().getClass() == TextDirectEditManager.class) {
+			((TextDirectEditManager) getManager()).show(eventLocation.getSWTPoint());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void performDirectEdit(char initialCharacter) {
+		if (getManager() instanceof TextDirectEditManager) {
+			((TextDirectEditManager) getManager()).show(initialCharacter);
+		} else //
+		{
+			performDirectEdit();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEditRequest(Request request) {
+		final Request theRequest = request;
+		try {
+			getEditingDomain().runExclusive(new Runnable() {
+
+				public void run() {
+					if (isActive() && isEditable()) {
+						if (theRequest.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
+							Character initialChar = (Character) theRequest.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
+							performDirectEdit(initialChar.charValue());
+						} else if ((theRequest instanceof DirectEditRequest) && (getEditText().equals(getLabelText()))) {
+							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
+							performDirectEdit(editRequest.getLocation());
+						} else {
+							performDirectEdit();
+						}
+					}
+				}
+			});
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshVisuals() {
+		super.refreshVisuals();
+		refreshLabel();
+		refreshFont();
+		refreshFontColor();
+		refreshUnderline();
+		refreshStrikeThrough();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshLabel() {
+		setLabelTextHelper(getFigure(), getLabelText());
+		setLabelIconHelper(getFigure(), getLabelIcon());
+		refreshSelectionFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshUnderline() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null && getFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshStrikeThrough() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null && getFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getFigure()).setTextStrikeThrough(style.isStrikeThrough());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshFont() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null) {
+			FontData fontData = new FontData(style.getFontName(), style.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL) | (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
+			setFont(fontData);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void refreshSelectionFeedback() {
+		requestEditPolicyFeedbackRefresh(EditPolicy.PRIMARY_DRAG_ROLE);
+		requestEditPolicyFeedbackRefresh(EditPolicy.SELECTION_FEEDBACK_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	private void requestEditPolicyFeedbackRefresh(String editPolicyKey) {
+		Object editPolicy = getEditPolicy(editPolicyKey);
+		if (editPolicy instanceof IRefreshableFeedbackEditPolicy) {
+			((IRefreshableFeedbackEditPolicy) editPolicy).refreshFeedback();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setFontColor(Color color) {
+		getFigure().setForegroundColor(color);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void addSemanticListeners() {
+		if (getParser() instanceof ISemanticParser) {
+			EObject element = resolveSemanticElement();
+			parserElements = ((ISemanticParser) getParser()).getSemanticElementsBeingParsed(element);
+			for (int i = 0; i < parserElements.size(); i++) {
+				addListenerFilter("SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
+			}
+		} else {
+			super.addSemanticListeners();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void removeSemanticListeners() {
+		if (parserElements != null) {
+			for (int i = 0; i < parserElements.size(); i++) {
+				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
+			}
+		} else {
+			super.removeSemanticListeners();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected AccessibleEditPart getAccessibleEditPart() {
+		if (accessibleEP == null) {
+			accessibleEP = new AccessibleGraphicalEditPart() {
+
+				public void getName(AccessibleEvent e) {
+					e.result = getLabelTextHelper(getFigure());
+				}
+			};
+		}
+		return accessibleEP;
+	}
+
+	/**
+	 * @generated
+	 */
+	private View getFontStyleOwnerView() {
+		return getPrimaryView();
+	}
+
+	/**
+	 * @generated
+	 */
+	private ILabelDelegate getLabelDelegate() {
+		if (labelDelegate == null) {
+			IFigure label = getFigure();
+			if (label instanceof WrappingLabel) {
+				labelDelegate = new WrappingLabelDelegate((WrappingLabel) label);
+			} else {
+				labelDelegate = new SimpleLabelDelegate((Label) label);
+			}
+		}
+		return labelDelegate;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public Object getAdapter(Class key) {
+		if (ILabelDelegate.class.equals(key)) {
+			return getLabelDelegate();
+		}
+		return super.getAdapter(key);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void addNotationalListeners() {
+		super.addNotationalListeners();
+		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void removeNotationalListeners() {
+		super.removeNotationalListeners();
+		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void handleNotificationEvent(Notification event) {
+		Object feature = event.getFeature();
+		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
+			Integer c = (Integer) event.getNewValue();
+			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
+		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(feature)) {
+			refreshUnderline();
+		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough().equals(feature)) {
+			refreshStrikeThrough();
+		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(feature) || NotationPackage.eINSTANCE.getFontStyle_FontName().equals(feature)
+				|| NotationPackage.eINSTANCE.getFontStyle_Bold().equals(feature) || NotationPackage.eINSTANCE.getFontStyle_Italic().equals(feature)) {
+			refreshFont();
+		} else {
+			if (getParser() != null && getParser().isAffectingEvent(event, getParserOptions().intValue())) {
+				refreshLabel();
+			}
+			if (getParser() instanceof ISemanticParser) {
+				ISemanticParser modelParser = (ISemanticParser) getParser();
+				if (modelParser.areSemanticElementsAffected(null, event)) {
+					removeSemanticListeners();
+					if (resolveSemanticElement() != null) {
+						addSemanticListeners();
+					}
+					refreshLabel();
+				}
+			}
+		}
+		super.handleNotificationEvent(event);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createFigure() {
+		// Parent should assign one using setLabel() method
+		return null;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkEditPart.java
new file mode 100644
index 0000000..627fe5f
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkEditPart.java
@@ -0,0 +1,185 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.Connection;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITreeBranchEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LabeledLinkItemSemanticEditPolicy;
+
+/**
+	 * @generated
+	 */
+public class LabeledLinkEditPart extends ConnectionNodeEditPart implements ITreeBranchEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 4002;
+
+	/**
+	 * @generated
+	 */
+	public LabeledLinkEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new LabeledLinkItemSemanticEditPolicy());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean addFixedChild(EditPart childEditPart) {
+		if (childEditPart instanceof LabeledLinkSourceNameEditPart) {
+			((LabeledLinkSourceNameEditPart) childEditPart).setLabel(getPrimaryShape().getFigureSourceNameFIgure());
+		}
+		if (childEditPart instanceof LabeledLinkTargetNameEditPart) {
+			((LabeledLinkTargetNameEditPart) childEditPart).setLabel(getPrimaryShape().getFigureTargetNameFigure());
+		}
+		if (childEditPart instanceof LabeledLinkLinkNameEditPart) {
+			((LabeledLinkLinkNameEditPart) childEditPart).setLabel(getPrimaryShape().getFigureLinkName());
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void addChildVisual(EditPart childEditPart, int index) {
+		if (addFixedChild(childEditPart)) {
+			return;
+		}
+		super.addChildVisual(childEditPart, index);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean removeFixedChild(EditPart childEditPart) {
+		if (childEditPart instanceof LabeledLinkSourceNameEditPart) {
+			return true;
+		}
+		if (childEditPart instanceof LabeledLinkTargetNameEditPart) {
+			return true;
+		}
+		if (childEditPart instanceof LabeledLinkLinkNameEditPart) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void removeChildVisual(EditPart childEditPart) {
+		if (removeFixedChild(childEditPart)) {
+			return;
+		}
+		super.removeChildVisual(childEditPart);
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected Connection createConnectionFigure() {
+		return new LabeledLinkFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public LabeledLinkFigure getPrimaryShape() {
+		return (LabeledLinkFigure) getFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public class LabeledLinkFigure extends PolylineConnectionEx {
+
+		/**
+		 * @generated
+		 */
+		private WrappingLabel fFigureSourceNameFIgure;
+
+		/**
+		 * @generated
+		 */
+		private WrappingLabel fFigureTargetNameFigure;
+
+		/**
+		 * @generated
+		 */
+		private WrappingLabel fFigureLinkName;
+
+		/**
+		 * @generated
+		 */
+		public LabeledLinkFigure() {
+
+			createContents();
+		}
+
+		/**
+		 * @generated
+		 */
+		private void createContents() {
+
+			fFigureLinkName = new WrappingLabel();
+
+			fFigureLinkName.setText("LabeldLink");
+
+			this.add(fFigureLinkName);
+
+			fFigureSourceNameFIgure = new WrappingLabel();
+
+			fFigureSourceNameFIgure.setText("Source");
+
+			this.add(fFigureSourceNameFIgure);
+
+			fFigureTargetNameFigure = new WrappingLabel();
+
+			fFigureTargetNameFigure.setText("Target");
+
+			this.add(fFigureTargetNameFigure);
+
+		}
+
+		/**
+		 * @generated
+		 */
+		public WrappingLabel getFigureSourceNameFIgure() {
+			return fFigureSourceNameFIgure;
+		}
+
+		/**
+		 * @generated
+		 */
+		public WrappingLabel getFigureTargetNameFigure() {
+			return fFigureTargetNameFigure;
+		}
+
+		/**
+		 * @generated
+		 */
+		public WrappingLabel getFigureLinkName() {
+			return fFigureLinkName;
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkLinkNameEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkLinkNameEditPart.java
new file mode 100644
index 0000000..eec890b
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkLinkNameEditPart.java
@@ -0,0 +1,579 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.ConnectionLocator;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RunnableWithResult;
+import org.eclipse.gef.AccessibleEditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.gef.tools.DirectEditManager;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
+import org.eclipse.gmf.runtime.diagram.ui.label.ILabelDelegate;
+import org.eclipse.gmf.runtime.diagram.ui.label.WrappingLabelDelegate;
+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
+import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
+import org.eclipse.gmf.runtime.notation.FontStyle;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfTextSelectionEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfParserProvider;
+import org.eclipse.gmf.tooling.runtime.draw2d.labels.SimpleLabelDelegate;
+import org.eclipse.gmf.tooling.runtime.edit.policies.DefaultLinkLabelDragPolicy;
+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.viewers.ICellEditorValidator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @generated
+ */
+public class LabeledLinkLinkNameEditPart extends LabelEditPart implements ITextAwareEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 6003;
+
+	/**
+	 * @generated
+	 */
+	private DirectEditManager manager;
+
+	/**
+	 * @generated
+	 */
+	private IParser parser;
+
+	/**
+	 * @generated
+	 */
+	private List<?> parserElements;
+
+	/**
+	 * @generated
+	 */
+	private String defaultText;
+
+	/**
+	 * @generated
+	 */
+	private ILabelDelegate labelDelegate;
+
+	/**
+	 * @generated
+	 */
+	static {
+		registerSnapBackPosition(LinklfVisualIDRegistry.getType(org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkLinkNameEditPart.VISUAL_ID), new Point(0, 80));
+	}
+
+	/**
+	 * @generated
+	 */
+	public LabeledLinkLinkNameEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy());
+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new LinklfTextSelectionEditPolicy());
+		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DefaultLinkLabelDragPolicy());
+	}
+
+	/**
+	 * @generated
+	 */
+	public int getKeyPoint() {
+		return ConnectionLocator.MIDDLE;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getLabelTextHelper(IFigure figure) {
+		if (figure instanceof WrappingLabel) {
+			return ((WrappingLabel) figure).getText();
+		} else if (figure instanceof Label) {
+			return ((Label) figure).getText();
+		} else {
+			return getLabelDelegate().getText();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLabelTextHelper(IFigure figure, String text) {
+		if (figure instanceof WrappingLabel) {
+			((WrappingLabel) figure).setText(text);
+		} else if (figure instanceof Label) {
+			((Label) figure).setText(text);
+		} else {
+			getLabelDelegate().setText(text);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Image getLabelIconHelper(IFigure figure) {
+		if (figure instanceof WrappingLabel) {
+			return ((WrappingLabel) figure).getIcon();
+		} else if (figure instanceof Label) {
+			return ((Label) figure).getIcon();
+		} else {
+			return getLabelDelegate().getIcon(0);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLabelIconHelper(IFigure figure, Image icon) {
+		if (figure instanceof WrappingLabel) {
+			((WrappingLabel) figure).setIcon(icon);
+			return;
+		} else if (figure instanceof Label) {
+			((Label) figure).setIcon(icon);
+			return;
+		} else {
+			getLabelDelegate().setIcon(icon, 0);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLabel(WrappingLabel figure) {
+		unregisterVisuals();
+		setFigure(figure);
+		defaultText = getLabelTextHelper(figure);
+		registerVisuals();
+		refreshVisuals();
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	protected List getModelChildren() {
+		return Collections.EMPTY_LIST;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EObject getParserElement() {
+		return resolveSemanticElement();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Image getLabelIcon() {
+		EObject parserElement = getParserElement();
+		if (parserElement == null) {
+			return null;
+		}
+		return LinklfElementTypes.getImage(parserElement.eClass());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getLabelText() {
+		String text = null;
+		EObject parserElement = getParserElement();
+		if (parserElement != null && getParser() != null) {
+			text = getParser().getPrintString(new EObjectAdapter(parserElement), getParserOptions().intValue());
+		}
+		if (text == null || text.length() == 0) {
+			text = defaultText;
+		}
+		return text;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLabelText(String text) {
+		setLabelTextHelper(getFigure(), text);
+		refreshSelectionFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getEditText() {
+		if (getParserElement() == null || getParser() == null) {
+			return ""; //$NON-NLS-1$
+		}
+		return getParser().getEditString(new EObjectAdapter(getParserElement()), getParserOptions().intValue());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isEditable() {
+		return getParser() != null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public ICellEditorValidator getEditTextValidator() {
+		return new ICellEditorValidator() {
+
+			public String isValid(final Object value) {
+				if (value instanceof String) {
+					final EObject element = getParserElement();
+					final IParser parser = getParser();
+					try {
+						IParserEditStatus valid = (IParserEditStatus) getEditingDomain().runExclusive(new RunnableWithResult.Impl<IParserEditStatus>() {
+
+							public void run() {
+								setResult(parser.isValidEditString(new EObjectAdapter(element), (String) value));
+							}
+						});
+						return valid.getCode() == ParserEditStatus.EDITABLE ? null : valid.getMessage();
+					} catch (InterruptedException ie) {
+						ie.printStackTrace();
+					}
+				}
+
+				// shouldn't get here
+				return null;
+			}
+		};
+	}
+
+	/**
+	 * @generated
+	 */
+	public IContentAssistProcessor getCompletionProcessor() {
+		if (getParserElement() == null || getParser() == null) {
+			return null;
+		}
+		return getParser().getCompletionProcessor(new EObjectAdapter(getParserElement()));
+	}
+
+	/**
+	 * @generated
+	 */
+	public ParserOptions getParserOptions() {
+		return ParserOptions.NONE;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IParser getParser() {
+		if (parser == null) {
+			parser = LinklfParserProvider.getParser(LinklfElementTypes.LabeledLink_4002, getParserElement(),
+					LinklfVisualIDRegistry.getType(org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkLinkNameEditPart.VISUAL_ID));
+		}
+		return parser;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected DirectEditManager getManager() {
+		if (manager == null) {
+			setManager(new TextDirectEditManager(this, null, LinklfEditPartFactory.getTextCellEditorLocator(this)));
+		}
+		return manager;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setManager(DirectEditManager manager) {
+		this.manager = manager;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEdit() {
+		getManager().show();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEdit(Point eventLocation) {
+		if (getManager().getClass() == TextDirectEditManager.class) {
+			((TextDirectEditManager) getManager()).show(eventLocation.getSWTPoint());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void performDirectEdit(char initialCharacter) {
+		if (getManager() instanceof TextDirectEditManager) {
+			((TextDirectEditManager) getManager()).show(initialCharacter);
+		} else //
+		{
+			performDirectEdit();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEditRequest(Request request) {
+		final Request theRequest = request;
+		try {
+			getEditingDomain().runExclusive(new Runnable() {
+
+				public void run() {
+					if (isActive() && isEditable()) {
+						if (theRequest.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
+							Character initialChar = (Character) theRequest.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
+							performDirectEdit(initialChar.charValue());
+						} else if ((theRequest instanceof DirectEditRequest) && (getEditText().equals(getLabelText()))) {
+							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
+							performDirectEdit(editRequest.getLocation());
+						} else {
+							performDirectEdit();
+						}
+					}
+				}
+			});
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshVisuals() {
+		super.refreshVisuals();
+		refreshLabel();
+		refreshFont();
+		refreshFontColor();
+		refreshUnderline();
+		refreshStrikeThrough();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshLabel() {
+		setLabelTextHelper(getFigure(), getLabelText());
+		setLabelIconHelper(getFigure(), getLabelIcon());
+		refreshSelectionFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshUnderline() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null && getFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshStrikeThrough() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null && getFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getFigure()).setTextStrikeThrough(style.isStrikeThrough());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshFont() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null) {
+			FontData fontData = new FontData(style.getFontName(), style.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL) | (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
+			setFont(fontData);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void refreshSelectionFeedback() {
+		requestEditPolicyFeedbackRefresh(EditPolicy.PRIMARY_DRAG_ROLE);
+		requestEditPolicyFeedbackRefresh(EditPolicy.SELECTION_FEEDBACK_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	private void requestEditPolicyFeedbackRefresh(String editPolicyKey) {
+		Object editPolicy = getEditPolicy(editPolicyKey);
+		if (editPolicy instanceof IRefreshableFeedbackEditPolicy) {
+			((IRefreshableFeedbackEditPolicy) editPolicy).refreshFeedback();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setFontColor(Color color) {
+		getFigure().setForegroundColor(color);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void addSemanticListeners() {
+		if (getParser() instanceof ISemanticParser) {
+			EObject element = resolveSemanticElement();
+			parserElements = ((ISemanticParser) getParser()).getSemanticElementsBeingParsed(element);
+			for (int i = 0; i < parserElements.size(); i++) {
+				addListenerFilter("SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
+			}
+		} else {
+			super.addSemanticListeners();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void removeSemanticListeners() {
+		if (parserElements != null) {
+			for (int i = 0; i < parserElements.size(); i++) {
+				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
+			}
+		} else {
+			super.removeSemanticListeners();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected AccessibleEditPart getAccessibleEditPart() {
+		if (accessibleEP == null) {
+			accessibleEP = new AccessibleGraphicalEditPart() {
+
+				public void getName(AccessibleEvent e) {
+					e.result = getLabelTextHelper(getFigure());
+				}
+			};
+		}
+		return accessibleEP;
+	}
+
+	/**
+	 * @generated
+	 */
+	private View getFontStyleOwnerView() {
+		return getPrimaryView();
+	}
+
+	/**
+	 * @generated
+	 */
+	private ILabelDelegate getLabelDelegate() {
+		if (labelDelegate == null) {
+			IFigure label = getFigure();
+			if (label instanceof WrappingLabel) {
+				labelDelegate = new WrappingLabelDelegate((WrappingLabel) label);
+			} else {
+				labelDelegate = new SimpleLabelDelegate((Label) label);
+			}
+		}
+		return labelDelegate;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public Object getAdapter(Class key) {
+		if (ILabelDelegate.class.equals(key)) {
+			return getLabelDelegate();
+		}
+		return super.getAdapter(key);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void handleNotificationEvent(Notification event) {
+		Object feature = event.getFeature();
+		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
+			Integer c = (Integer) event.getNewValue();
+			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
+		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(feature)) {
+			refreshUnderline();
+		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough().equals(feature)) {
+			refreshStrikeThrough();
+		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(feature) || NotationPackage.eINSTANCE.getFontStyle_FontName().equals(feature)
+				|| NotationPackage.eINSTANCE.getFontStyle_Bold().equals(feature) || NotationPackage.eINSTANCE.getFontStyle_Italic().equals(feature)) {
+			refreshFont();
+		} else {
+			if (getParser() != null && getParser().isAffectingEvent(event, getParserOptions().intValue())) {
+				refreshLabel();
+			}
+			if (getParser() instanceof ISemanticParser) {
+				ISemanticParser modelParser = (ISemanticParser) getParser();
+				if (modelParser.areSemanticElementsAffected(null, event)) {
+					removeSemanticListeners();
+					if (resolveSemanticElement() != null) {
+						addSemanticListeners();
+					}
+					refreshLabel();
+				}
+			}
+		}
+		super.handleNotificationEvent(event);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createFigure() {
+		// Parent should assign one using setLabel() method
+		return null;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkSourceNameEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkSourceNameEditPart.java
new file mode 100644
index 0000000..fe4f508
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkSourceNameEditPart.java
@@ -0,0 +1,579 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.ConnectionLocator;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RunnableWithResult;
+import org.eclipse.gef.AccessibleEditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.gef.tools.DirectEditManager;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
+import org.eclipse.gmf.runtime.diagram.ui.label.ILabelDelegate;
+import org.eclipse.gmf.runtime.diagram.ui.label.WrappingLabelDelegate;
+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
+import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
+import org.eclipse.gmf.runtime.notation.FontStyle;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfTextSelectionEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfParserProvider;
+import org.eclipse.gmf.tooling.runtime.draw2d.labels.SimpleLabelDelegate;
+import org.eclipse.gmf.tooling.runtime.edit.policies.DefaultLinkLabelDragPolicy;
+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.viewers.ICellEditorValidator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @generated
+ */
+public class LabeledLinkSourceNameEditPart extends LabelEditPart implements ITextAwareEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 6001;
+
+	/**
+	 * @generated
+	 */
+	private DirectEditManager manager;
+
+	/**
+	 * @generated
+	 */
+	private IParser parser;
+
+	/**
+	 * @generated
+	 */
+	private List<?> parserElements;
+
+	/**
+	 * @generated
+	 */
+	private String defaultText;
+
+	/**
+	 * @generated
+	 */
+	private ILabelDelegate labelDelegate;
+
+	/**
+	 * @generated
+	 */
+	static {
+		registerSnapBackPosition(LinklfVisualIDRegistry.getType(org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkSourceNameEditPart.VISUAL_ID), new Point(0, 40));
+	}
+
+	/**
+	 * @generated
+	 */
+	public LabeledLinkSourceNameEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy());
+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new LinklfTextSelectionEditPolicy());
+		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DefaultLinkLabelDragPolicy());
+	}
+
+	/**
+	 * @generated
+	 */
+	public int getKeyPoint() {
+		return ConnectionLocator.TARGET;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getLabelTextHelper(IFigure figure) {
+		if (figure instanceof WrappingLabel) {
+			return ((WrappingLabel) figure).getText();
+		} else if (figure instanceof Label) {
+			return ((Label) figure).getText();
+		} else {
+			return getLabelDelegate().getText();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLabelTextHelper(IFigure figure, String text) {
+		if (figure instanceof WrappingLabel) {
+			((WrappingLabel) figure).setText(text);
+		} else if (figure instanceof Label) {
+			((Label) figure).setText(text);
+		} else {
+			getLabelDelegate().setText(text);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Image getLabelIconHelper(IFigure figure) {
+		if (figure instanceof WrappingLabel) {
+			return ((WrappingLabel) figure).getIcon();
+		} else if (figure instanceof Label) {
+			return ((Label) figure).getIcon();
+		} else {
+			return getLabelDelegate().getIcon(0);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLabelIconHelper(IFigure figure, Image icon) {
+		if (figure instanceof WrappingLabel) {
+			((WrappingLabel) figure).setIcon(icon);
+			return;
+		} else if (figure instanceof Label) {
+			((Label) figure).setIcon(icon);
+			return;
+		} else {
+			getLabelDelegate().setIcon(icon, 0);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLabel(WrappingLabel figure) {
+		unregisterVisuals();
+		setFigure(figure);
+		defaultText = getLabelTextHelper(figure);
+		registerVisuals();
+		refreshVisuals();
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	protected List getModelChildren() {
+		return Collections.EMPTY_LIST;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EObject getParserElement() {
+		return resolveSemanticElement();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Image getLabelIcon() {
+		EObject parserElement = getParserElement();
+		if (parserElement == null) {
+			return null;
+		}
+		return LinklfElementTypes.getImage(parserElement.eClass());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getLabelText() {
+		String text = null;
+		EObject parserElement = getParserElement();
+		if (parserElement != null && getParser() != null) {
+			text = getParser().getPrintString(new EObjectAdapter(parserElement), getParserOptions().intValue());
+		}
+		if (text == null || text.length() == 0) {
+			text = defaultText;
+		}
+		return text;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLabelText(String text) {
+		setLabelTextHelper(getFigure(), text);
+		refreshSelectionFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getEditText() {
+		if (getParserElement() == null || getParser() == null) {
+			return ""; //$NON-NLS-1$
+		}
+		return getParser().getEditString(new EObjectAdapter(getParserElement()), getParserOptions().intValue());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isEditable() {
+		return getParser() != null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public ICellEditorValidator getEditTextValidator() {
+		return new ICellEditorValidator() {
+
+			public String isValid(final Object value) {
+				if (value instanceof String) {
+					final EObject element = getParserElement();
+					final IParser parser = getParser();
+					try {
+						IParserEditStatus valid = (IParserEditStatus) getEditingDomain().runExclusive(new RunnableWithResult.Impl<IParserEditStatus>() {
+
+							public void run() {
+								setResult(parser.isValidEditString(new EObjectAdapter(element), (String) value));
+							}
+						});
+						return valid.getCode() == ParserEditStatus.EDITABLE ? null : valid.getMessage();
+					} catch (InterruptedException ie) {
+						ie.printStackTrace();
+					}
+				}
+
+				// shouldn't get here
+				return null;
+			}
+		};
+	}
+
+	/**
+	 * @generated
+	 */
+	public IContentAssistProcessor getCompletionProcessor() {
+		if (getParserElement() == null || getParser() == null) {
+			return null;
+		}
+		return getParser().getCompletionProcessor(new EObjectAdapter(getParserElement()));
+	}
+
+	/**
+	 * @generated
+	 */
+	public ParserOptions getParserOptions() {
+		return ParserOptions.NONE;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IParser getParser() {
+		if (parser == null) {
+			parser = LinklfParserProvider.getParser(LinklfElementTypes.LabeledLink_4002, getParserElement(),
+					LinklfVisualIDRegistry.getType(org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkSourceNameEditPart.VISUAL_ID));
+		}
+		return parser;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected DirectEditManager getManager() {
+		if (manager == null) {
+			setManager(new TextDirectEditManager(this, null, LinklfEditPartFactory.getTextCellEditorLocator(this)));
+		}
+		return manager;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setManager(DirectEditManager manager) {
+		this.manager = manager;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEdit() {
+		getManager().show();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEdit(Point eventLocation) {
+		if (getManager().getClass() == TextDirectEditManager.class) {
+			((TextDirectEditManager) getManager()).show(eventLocation.getSWTPoint());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void performDirectEdit(char initialCharacter) {
+		if (getManager() instanceof TextDirectEditManager) {
+			((TextDirectEditManager) getManager()).show(initialCharacter);
+		} else //
+		{
+			performDirectEdit();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEditRequest(Request request) {
+		final Request theRequest = request;
+		try {
+			getEditingDomain().runExclusive(new Runnable() {
+
+				public void run() {
+					if (isActive() && isEditable()) {
+						if (theRequest.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
+							Character initialChar = (Character) theRequest.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
+							performDirectEdit(initialChar.charValue());
+						} else if ((theRequest instanceof DirectEditRequest) && (getEditText().equals(getLabelText()))) {
+							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
+							performDirectEdit(editRequest.getLocation());
+						} else {
+							performDirectEdit();
+						}
+					}
+				}
+			});
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshVisuals() {
+		super.refreshVisuals();
+		refreshLabel();
+		refreshFont();
+		refreshFontColor();
+		refreshUnderline();
+		refreshStrikeThrough();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshLabel() {
+		setLabelTextHelper(getFigure(), getLabelText());
+		setLabelIconHelper(getFigure(), getLabelIcon());
+		refreshSelectionFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshUnderline() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null && getFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshStrikeThrough() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null && getFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getFigure()).setTextStrikeThrough(style.isStrikeThrough());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshFont() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null) {
+			FontData fontData = new FontData(style.getFontName(), style.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL) | (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
+			setFont(fontData);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void refreshSelectionFeedback() {
+		requestEditPolicyFeedbackRefresh(EditPolicy.PRIMARY_DRAG_ROLE);
+		requestEditPolicyFeedbackRefresh(EditPolicy.SELECTION_FEEDBACK_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	private void requestEditPolicyFeedbackRefresh(String editPolicyKey) {
+		Object editPolicy = getEditPolicy(editPolicyKey);
+		if (editPolicy instanceof IRefreshableFeedbackEditPolicy) {
+			((IRefreshableFeedbackEditPolicy) editPolicy).refreshFeedback();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setFontColor(Color color) {
+		getFigure().setForegroundColor(color);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void addSemanticListeners() {
+		if (getParser() instanceof ISemanticParser) {
+			EObject element = resolveSemanticElement();
+			parserElements = ((ISemanticParser) getParser()).getSemanticElementsBeingParsed(element);
+			for (int i = 0; i < parserElements.size(); i++) {
+				addListenerFilter("SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
+			}
+		} else {
+			super.addSemanticListeners();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void removeSemanticListeners() {
+		if (parserElements != null) {
+			for (int i = 0; i < parserElements.size(); i++) {
+				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
+			}
+		} else {
+			super.removeSemanticListeners();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected AccessibleEditPart getAccessibleEditPart() {
+		if (accessibleEP == null) {
+			accessibleEP = new AccessibleGraphicalEditPart() {
+
+				public void getName(AccessibleEvent e) {
+					e.result = getLabelTextHelper(getFigure());
+				}
+			};
+		}
+		return accessibleEP;
+	}
+
+	/**
+	 * @generated
+	 */
+	private View getFontStyleOwnerView() {
+		return getPrimaryView();
+	}
+
+	/**
+	 * @generated
+	 */
+	private ILabelDelegate getLabelDelegate() {
+		if (labelDelegate == null) {
+			IFigure label = getFigure();
+			if (label instanceof WrappingLabel) {
+				labelDelegate = new WrappingLabelDelegate((WrappingLabel) label);
+			} else {
+				labelDelegate = new SimpleLabelDelegate((Label) label);
+			}
+		}
+		return labelDelegate;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public Object getAdapter(Class key) {
+		if (ILabelDelegate.class.equals(key)) {
+			return getLabelDelegate();
+		}
+		return super.getAdapter(key);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void handleNotificationEvent(Notification event) {
+		Object feature = event.getFeature();
+		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
+			Integer c = (Integer) event.getNewValue();
+			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
+		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(feature)) {
+			refreshUnderline();
+		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough().equals(feature)) {
+			refreshStrikeThrough();
+		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(feature) || NotationPackage.eINSTANCE.getFontStyle_FontName().equals(feature)
+				|| NotationPackage.eINSTANCE.getFontStyle_Bold().equals(feature) || NotationPackage.eINSTANCE.getFontStyle_Italic().equals(feature)) {
+			refreshFont();
+		} else {
+			if (getParser() != null && getParser().isAffectingEvent(event, getParserOptions().intValue())) {
+				refreshLabel();
+			}
+			if (getParser() instanceof ISemanticParser) {
+				ISemanticParser modelParser = (ISemanticParser) getParser();
+				if (modelParser.areSemanticElementsAffected(null, event)) {
+					removeSemanticListeners();
+					if (resolveSemanticElement() != null) {
+						addSemanticListeners();
+					}
+					refreshLabel();
+				}
+			}
+		}
+		super.handleNotificationEvent(event);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createFigure() {
+		// Parent should assign one using setLabel() method
+		return null;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkTargetNameEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkTargetNameEditPart.java
new file mode 100644
index 0000000..2531072
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LabeledLinkTargetNameEditPart.java
@@ -0,0 +1,579 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.ConnectionLocator;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RunnableWithResult;
+import org.eclipse.gef.AccessibleEditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.gef.tools.DirectEditManager;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
+import org.eclipse.gmf.runtime.diagram.ui.label.ILabelDelegate;
+import org.eclipse.gmf.runtime.diagram.ui.label.WrappingLabelDelegate;
+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
+import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
+import org.eclipse.gmf.runtime.notation.FontStyle;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfTextSelectionEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfParserProvider;
+import org.eclipse.gmf.tooling.runtime.draw2d.labels.SimpleLabelDelegate;
+import org.eclipse.gmf.tooling.runtime.edit.policies.DefaultLinkLabelDragPolicy;
+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.viewers.ICellEditorValidator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @generated
+ */
+public class LabeledLinkTargetNameEditPart extends LabelEditPart implements ITextAwareEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 6002;
+
+	/**
+	 * @generated
+	 */
+	private DirectEditManager manager;
+
+	/**
+	 * @generated
+	 */
+	private IParser parser;
+
+	/**
+	 * @generated
+	 */
+	private List<?> parserElements;
+
+	/**
+	 * @generated
+	 */
+	private String defaultText;
+
+	/**
+	 * @generated
+	 */
+	private ILabelDelegate labelDelegate;
+
+	/**
+	 * @generated
+	 */
+	static {
+		registerSnapBackPosition(LinklfVisualIDRegistry.getType(org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkTargetNameEditPart.VISUAL_ID), new Point(0, 60));
+	}
+
+	/**
+	 * @generated
+	 */
+	public LabeledLinkTargetNameEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy());
+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new LinklfTextSelectionEditPolicy());
+		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DefaultLinkLabelDragPolicy());
+	}
+
+	/**
+	 * @generated
+	 */
+	public int getKeyPoint() {
+		return ConnectionLocator.SOURCE;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getLabelTextHelper(IFigure figure) {
+		if (figure instanceof WrappingLabel) {
+			return ((WrappingLabel) figure).getText();
+		} else if (figure instanceof Label) {
+			return ((Label) figure).getText();
+		} else {
+			return getLabelDelegate().getText();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLabelTextHelper(IFigure figure, String text) {
+		if (figure instanceof WrappingLabel) {
+			((WrappingLabel) figure).setText(text);
+		} else if (figure instanceof Label) {
+			((Label) figure).setText(text);
+		} else {
+			getLabelDelegate().setText(text);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Image getLabelIconHelper(IFigure figure) {
+		if (figure instanceof WrappingLabel) {
+			return ((WrappingLabel) figure).getIcon();
+		} else if (figure instanceof Label) {
+			return ((Label) figure).getIcon();
+		} else {
+			return getLabelDelegate().getIcon(0);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLabelIconHelper(IFigure figure, Image icon) {
+		if (figure instanceof WrappingLabel) {
+			((WrappingLabel) figure).setIcon(icon);
+			return;
+		} else if (figure instanceof Label) {
+			((Label) figure).setIcon(icon);
+			return;
+		} else {
+			getLabelDelegate().setIcon(icon, 0);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLabel(WrappingLabel figure) {
+		unregisterVisuals();
+		setFigure(figure);
+		defaultText = getLabelTextHelper(figure);
+		registerVisuals();
+		refreshVisuals();
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	protected List getModelChildren() {
+		return Collections.EMPTY_LIST;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EObject getParserElement() {
+		return resolveSemanticElement();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Image getLabelIcon() {
+		EObject parserElement = getParserElement();
+		if (parserElement == null) {
+			return null;
+		}
+		return LinklfElementTypes.getImage(parserElement.eClass());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getLabelText() {
+		String text = null;
+		EObject parserElement = getParserElement();
+		if (parserElement != null && getParser() != null) {
+			text = getParser().getPrintString(new EObjectAdapter(parserElement), getParserOptions().intValue());
+		}
+		if (text == null || text.length() == 0) {
+			text = defaultText;
+		}
+		return text;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLabelText(String text) {
+		setLabelTextHelper(getFigure(), text);
+		refreshSelectionFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getEditText() {
+		if (getParserElement() == null || getParser() == null) {
+			return ""; //$NON-NLS-1$
+		}
+		return getParser().getEditString(new EObjectAdapter(getParserElement()), getParserOptions().intValue());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isEditable() {
+		return getParser() != null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public ICellEditorValidator getEditTextValidator() {
+		return new ICellEditorValidator() {
+
+			public String isValid(final Object value) {
+				if (value instanceof String) {
+					final EObject element = getParserElement();
+					final IParser parser = getParser();
+					try {
+						IParserEditStatus valid = (IParserEditStatus) getEditingDomain().runExclusive(new RunnableWithResult.Impl<IParserEditStatus>() {
+
+							public void run() {
+								setResult(parser.isValidEditString(new EObjectAdapter(element), (String) value));
+							}
+						});
+						return valid.getCode() == ParserEditStatus.EDITABLE ? null : valid.getMessage();
+					} catch (InterruptedException ie) {
+						ie.printStackTrace();
+					}
+				}
+
+				// shouldn't get here
+				return null;
+			}
+		};
+	}
+
+	/**
+	 * @generated
+	 */
+	public IContentAssistProcessor getCompletionProcessor() {
+		if (getParserElement() == null || getParser() == null) {
+			return null;
+		}
+		return getParser().getCompletionProcessor(new EObjectAdapter(getParserElement()));
+	}
+
+	/**
+	 * @generated
+	 */
+	public ParserOptions getParserOptions() {
+		return ParserOptions.NONE;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IParser getParser() {
+		if (parser == null) {
+			parser = LinklfParserProvider.getParser(LinklfElementTypes.LabeledLink_4002, getParserElement(),
+					LinklfVisualIDRegistry.getType(org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkTargetNameEditPart.VISUAL_ID));
+		}
+		return parser;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected DirectEditManager getManager() {
+		if (manager == null) {
+			setManager(new TextDirectEditManager(this, null, LinklfEditPartFactory.getTextCellEditorLocator(this)));
+		}
+		return manager;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setManager(DirectEditManager manager) {
+		this.manager = manager;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEdit() {
+		getManager().show();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEdit(Point eventLocation) {
+		if (getManager().getClass() == TextDirectEditManager.class) {
+			((TextDirectEditManager) getManager()).show(eventLocation.getSWTPoint());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void performDirectEdit(char initialCharacter) {
+		if (getManager() instanceof TextDirectEditManager) {
+			((TextDirectEditManager) getManager()).show(initialCharacter);
+		} else //
+		{
+			performDirectEdit();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performDirectEditRequest(Request request) {
+		final Request theRequest = request;
+		try {
+			getEditingDomain().runExclusive(new Runnable() {
+
+				public void run() {
+					if (isActive() && isEditable()) {
+						if (theRequest.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
+							Character initialChar = (Character) theRequest.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
+							performDirectEdit(initialChar.charValue());
+						} else if ((theRequest instanceof DirectEditRequest) && (getEditText().equals(getLabelText()))) {
+							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
+							performDirectEdit(editRequest.getLocation());
+						} else {
+							performDirectEdit();
+						}
+					}
+				}
+			});
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshVisuals() {
+		super.refreshVisuals();
+		refreshLabel();
+		refreshFont();
+		refreshFontColor();
+		refreshUnderline();
+		refreshStrikeThrough();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshLabel() {
+		setLabelTextHelper(getFigure(), getLabelText());
+		setLabelIconHelper(getFigure(), getLabelIcon());
+		refreshSelectionFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshUnderline() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null && getFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshStrikeThrough() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null && getFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getFigure()).setTextStrikeThrough(style.isStrikeThrough());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshFont() {
+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle());
+		if (style != null) {
+			FontData fontData = new FontData(style.getFontName(), style.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL) | (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
+			setFont(fontData);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void refreshSelectionFeedback() {
+		requestEditPolicyFeedbackRefresh(EditPolicy.PRIMARY_DRAG_ROLE);
+		requestEditPolicyFeedbackRefresh(EditPolicy.SELECTION_FEEDBACK_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	private void requestEditPolicyFeedbackRefresh(String editPolicyKey) {
+		Object editPolicy = getEditPolicy(editPolicyKey);
+		if (editPolicy instanceof IRefreshableFeedbackEditPolicy) {
+			((IRefreshableFeedbackEditPolicy) editPolicy).refreshFeedback();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setFontColor(Color color) {
+		getFigure().setForegroundColor(color);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void addSemanticListeners() {
+		if (getParser() instanceof ISemanticParser) {
+			EObject element = resolveSemanticElement();
+			parserElements = ((ISemanticParser) getParser()).getSemanticElementsBeingParsed(element);
+			for (int i = 0; i < parserElements.size(); i++) {
+				addListenerFilter("SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
+			}
+		} else {
+			super.addSemanticListeners();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void removeSemanticListeners() {
+		if (parserElements != null) {
+			for (int i = 0; i < parserElements.size(); i++) {
+				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
+			}
+		} else {
+			super.removeSemanticListeners();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected AccessibleEditPart getAccessibleEditPart() {
+		if (accessibleEP == null) {
+			accessibleEP = new AccessibleGraphicalEditPart() {
+
+				public void getName(AccessibleEvent e) {
+					e.result = getLabelTextHelper(getFigure());
+				}
+			};
+		}
+		return accessibleEP;
+	}
+
+	/**
+	 * @generated
+	 */
+	private View getFontStyleOwnerView() {
+		return getPrimaryView();
+	}
+
+	/**
+	 * @generated
+	 */
+	private ILabelDelegate getLabelDelegate() {
+		if (labelDelegate == null) {
+			IFigure label = getFigure();
+			if (label instanceof WrappingLabel) {
+				labelDelegate = new WrappingLabelDelegate((WrappingLabel) label);
+			} else {
+				labelDelegate = new SimpleLabelDelegate((Label) label);
+			}
+		}
+		return labelDelegate;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public Object getAdapter(Class key) {
+		if (ILabelDelegate.class.equals(key)) {
+			return getLabelDelegate();
+		}
+		return super.getAdapter(key);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void handleNotificationEvent(Notification event) {
+		Object feature = event.getFeature();
+		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
+			Integer c = (Integer) event.getNewValue();
+			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
+		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(feature)) {
+			refreshUnderline();
+		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough().equals(feature)) {
+			refreshStrikeThrough();
+		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(feature) || NotationPackage.eINSTANCE.getFontStyle_FontName().equals(feature)
+				|| NotationPackage.eINSTANCE.getFontStyle_Bold().equals(feature) || NotationPackage.eINSTANCE.getFontStyle_Italic().equals(feature)) {
+			refreshFont();
+		} else {
+			if (getParser() != null && getParser().isAffectingEvent(event, getParserOptions().intValue())) {
+				refreshLabel();
+			}
+			if (getParser() instanceof ISemanticParser) {
+				ISemanticParser modelParser = (ISemanticParser) getParser();
+				if (modelParser.areSemanticElementsAffected(null, event)) {
+					removeSemanticListeners();
+					if (resolveSemanticElement() != null) {
+						addSemanticListeners();
+					}
+					refreshLabel();
+				}
+			}
+		}
+		super.handleNotificationEvent(event);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createFigure() {
+		// Parent should assign one using setLabel() method
+		return null;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LinkEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LinkEditPart.java
new file mode 100644
index 0000000..58bbc98
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LinkEditPart.java
@@ -0,0 +1,55 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.Connection;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITreeBranchEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinkItemSemanticEditPolicy;
+
+/**
+	 * @generated
+	 */
+public class LinkEditPart extends ConnectionNodeEditPart implements ITreeBranchEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 4001;
+
+	/**
+	 * @generated
+	 */
+	public LinkEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new LinkItemSemanticEditPolicy());
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected Connection createConnectionFigure() {
+		return new PolylineConnectionEx();
+	}
+
+	/**
+	 * @generated
+	 */
+	public PolylineConnectionEx getPrimaryShape() {
+		return (PolylineConnectionEx) getFigure();
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LinklfEditPartFactory.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LinklfEditPartFactory.java
new file mode 100644
index 0000000..7f15f95
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/LinklfEditPartFactory.java
@@ -0,0 +1,101 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartFactory;
+import org.eclipse.gef.tools.CellEditorLocator;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.runtime.directedit.locator.CellEditorLocatorAccess;
+
+/**
+ * @generated
+ */
+public class LinklfEditPartFactory implements EditPartFactory {
+
+	/**
+	 * @generated
+	 */
+	public EditPart createEditPart(EditPart context, Object model) {
+		if (model instanceof View) {
+			View view = (View) model;
+			switch (LinklfVisualIDRegistry.getVisualID(view)) {
+
+			case CanvasEditPart.VISUAL_ID:
+				return new CanvasEditPart(view);
+
+			case CircleEditPart.VISUAL_ID:
+				return new CircleEditPart(view);
+
+			case RectangleEditPart.VISUAL_ID:
+				return new RectangleEditPart(view);
+
+			case ContainerEditPart.VISUAL_ID:
+				return new ContainerEditPart(view);
+
+			case ContainerNameEditPart.VISUAL_ID:
+				return new ContainerNameEditPart(view);
+
+			case RhombusEditPart.VISUAL_ID:
+				return new RhombusEditPart(view);
+
+			case Circle2EditPart.VISUAL_ID:
+				return new Circle2EditPart(view);
+
+			case Container2EditPart.VISUAL_ID:
+				return new Container2EditPart(view);
+
+			case ContainerName2EditPart.VISUAL_ID:
+				return new ContainerName2EditPart(view);
+
+			case Rectangle2EditPart.VISUAL_ID:
+				return new Rectangle2EditPart(view);
+
+			case Rhombus2EditPart.VISUAL_ID:
+				return new Rhombus2EditPart(view);
+
+			case PortEditPart.VISUAL_ID:
+				return new PortEditPart(view);
+
+			case ContainerContainerCompartmentEditPart.VISUAL_ID:
+				return new ContainerContainerCompartmentEditPart(view);
+
+			case ContainerContainerCompartment2EditPart.VISUAL_ID:
+				return new ContainerContainerCompartment2EditPart(view);
+
+			case LinkEditPart.VISUAL_ID:
+				return new LinkEditPart(view);
+
+			case LabeledLinkEditPart.VISUAL_ID:
+				return new LabeledLinkEditPart(view);
+
+			case LabeledLinkSourceNameEditPart.VISUAL_ID:
+				return new LabeledLinkSourceNameEditPart(view);
+
+			case LabeledLinkTargetNameEditPart.VISUAL_ID:
+				return new LabeledLinkTargetNameEditPart(view);
+
+			case LabeledLinkLinkNameEditPart.VISUAL_ID:
+				return new LabeledLinkLinkNameEditPart(view);
+
+			}
+		}
+		return createUnrecognizedEditPart(context, model);
+	}
+
+	/**
+	 * @generated
+	 */
+	private EditPart createUnrecognizedEditPart(EditPart context, Object model) {
+		// Handle creation of unrecognized child node EditParts here
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static CellEditorLocator getTextCellEditorLocator(ITextAwareEditPart source) {
+		return CellEditorLocatorAccess.INSTANCE.getTextCellEditorLocator(source);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/PortEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/PortEditPart.java
new file mode 100644
index 0000000..b4c27f7
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/PortEditPart.java
@@ -0,0 +1,184 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.Shape;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderItemEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.PortItemSemanticEditPolicy;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @generated
+ */
+public class PortEditPart extends AbstractBorderItemEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 3005;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure contentPane;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure primaryShape;
+
+	/**
+	 * @generated
+	 */
+	public PortEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, getPrimaryDragEditPolicy());
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new PortItemSemanticEditPolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies
+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected LayoutEditPolicy createLayoutEditPolicy() {
+		org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy lep = new org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy() {
+
+			protected EditPolicy createChildEditPolicy(EditPart child) {
+				EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
+				if (result == null) {
+					result = new NonResizableEditPolicy();
+				}
+				return result;
+			}
+
+			protected Command getMoveChildrenCommand(Request request) {
+				return null;
+			}
+
+			protected Command getCreateCommand(CreateRequest request) {
+				return null;
+			}
+		};
+		return lep;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createNodeShape() {
+		return primaryShape = new RectangleFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public RectangleFigure getPrimaryShape() {
+		return (RectangleFigure) primaryShape;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected NodeFigure createNodePlate() {
+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);
+
+		//FIXME: workaround for #154536
+		result.getBounds().setSize(result.getPreferredSize());
+		return result;
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected NodeFigure createNodeFigure() {
+		NodeFigure figure = createNodePlate();
+		figure.setLayoutManager(new StackLayout());
+		IFigure shape = createNodeShape();
+		figure.add(shape);
+		contentPane = setupContentPane(shape);
+		return figure;
+	}
+
+	/**
+	 * Default implementation treats passed figure as content pane.
+	 * Respects layout one may have set for generated figure.
+	 * @param nodeShape instance of generated figure class
+	 * @generated
+	 */
+	protected IFigure setupContentPane(IFigure nodeShape) {
+		return nodeShape; // use nodeShape itself as contentPane
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure getContentPane() {
+		if (contentPane != null) {
+			return contentPane;
+		}
+		return super.getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setForegroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setForegroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setBackgroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setBackgroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineWidth(int width) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineWidth(width);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineType(int style) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineStyle(style);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Rectangle2EditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Rectangle2EditPart.java
new file mode 100644
index 0000000..338c103
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Rectangle2EditPart.java
@@ -0,0 +1,196 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Shape;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.Rectangle2ItemSemanticEditPolicy;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @generated
+ */
+public class Rectangle2EditPart extends ShapeNodeEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 3003;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure contentPane;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure primaryShape;
+
+	/**
+	 * @generated
+	 */
+	public Rectangle2EditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new Rectangle2ItemSemanticEditPolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies
+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected LayoutEditPolicy createLayoutEditPolicy() {
+		org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy lep = new org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy() {
+
+			protected EditPolicy createChildEditPolicy(EditPart child) {
+				EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
+				if (result == null) {
+					result = new NonResizableEditPolicy();
+				}
+				return result;
+			}
+
+			protected Command getMoveChildrenCommand(Request request) {
+				return null;
+			}
+
+			protected Command getCreateCommand(CreateRequest request) {
+				return null;
+			}
+		};
+		return lep;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createNodeShape() {
+		return primaryShape = new RectangleFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public RectangleFigure getPrimaryShape() {
+		return (RectangleFigure) primaryShape;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected NodeFigure createNodePlate() {
+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);
+		return result;
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected NodeFigure createNodeFigure() {
+		NodeFigure figure = createNodePlate();
+		figure.setLayoutManager(new StackLayout());
+		IFigure shape = createNodeShape();
+		figure.add(shape);
+		contentPane = setupContentPane(shape);
+		return figure;
+	}
+
+	/**
+	 * Default implementation treats passed figure as content pane.
+	 * Respects layout one may have set for generated figure.
+	 * @param nodeShape instance of generated figure class
+	 * @generated
+	 */
+	protected IFigure setupContentPane(IFigure nodeShape) {
+		return nodeShape; // use nodeShape itself as contentPane
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure getContentPane() {
+		if (contentPane != null) {
+			return contentPane;
+		}
+		return super.getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setForegroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setForegroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setBackgroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setBackgroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineWidth(int width) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineWidth(width);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineType(int style) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineStyle(style);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public class RectangleFigure extends org.eclipse.draw2d.RectangleFigure {
+
+		/**
+		 * @generated
+		 */
+		public RectangleFigure() {
+			this.setLayoutManager(new StackLayout());
+			this.setLineWidth(2);
+			this.setForegroundColor(ColorConstants.darkGreen);
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/RectangleEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/RectangleEditPart.java
new file mode 100644
index 0000000..f1b0dbd
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/RectangleEditPart.java
@@ -0,0 +1,196 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Shape;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.RectangleItemSemanticEditPolicy;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @generated
+ */
+public class RectangleEditPart extends ShapeNodeEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 2002;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure contentPane;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure primaryShape;
+
+	/**
+	 * @generated
+	 */
+	public RectangleEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new RectangleItemSemanticEditPolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies
+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected LayoutEditPolicy createLayoutEditPolicy() {
+		org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy lep = new org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy() {
+
+			protected EditPolicy createChildEditPolicy(EditPart child) {
+				EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
+				if (result == null) {
+					result = new NonResizableEditPolicy();
+				}
+				return result;
+			}
+
+			protected Command getMoveChildrenCommand(Request request) {
+				return null;
+			}
+
+			protected Command getCreateCommand(CreateRequest request) {
+				return null;
+			}
+		};
+		return lep;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createNodeShape() {
+		return primaryShape = new RectangleFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public RectangleFigure getPrimaryShape() {
+		return (RectangleFigure) primaryShape;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected NodeFigure createNodePlate() {
+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);
+		return result;
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected NodeFigure createNodeFigure() {
+		NodeFigure figure = createNodePlate();
+		figure.setLayoutManager(new StackLayout());
+		IFigure shape = createNodeShape();
+		figure.add(shape);
+		contentPane = setupContentPane(shape);
+		return figure;
+	}
+
+	/**
+	 * Default implementation treats passed figure as content pane.
+	 * Respects layout one may have set for generated figure.
+	 * @param nodeShape instance of generated figure class
+	 * @generated
+	 */
+	protected IFigure setupContentPane(IFigure nodeShape) {
+		return nodeShape; // use nodeShape itself as contentPane
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure getContentPane() {
+		if (contentPane != null) {
+			return contentPane;
+		}
+		return super.getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setForegroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setForegroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setBackgroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setBackgroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineWidth(int width) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineWidth(width);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineType(int style) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineStyle(style);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public class RectangleFigure extends org.eclipse.draw2d.RectangleFigure {
+
+		/**
+		 * @generated
+		 */
+		public RectangleFigure() {
+			this.setLayoutManager(new StackLayout());
+			this.setLineWidth(2);
+			this.setForegroundColor(ColorConstants.darkGreen);
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Rhombus2EditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Rhombus2EditPart.java
new file mode 100644
index 0000000..6ab1a9a
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/Rhombus2EditPart.java
@@ -0,0 +1,204 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ScalablePolygonShape;
+import org.eclipse.draw2d.Shape;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.Rhombus2ItemSemanticEditPolicy;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @generated
+ */
+public class Rhombus2EditPart extends ShapeNodeEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 3004;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure contentPane;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure primaryShape;
+
+	/**
+	 * @generated
+	 */
+	public Rhombus2EditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new Rhombus2ItemSemanticEditPolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies
+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected LayoutEditPolicy createLayoutEditPolicy() {
+		org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy lep = new org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy() {
+
+			protected EditPolicy createChildEditPolicy(EditPart child) {
+				EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
+				if (result == null) {
+					result = new NonResizableEditPolicy();
+				}
+				return result;
+			}
+
+			protected Command getMoveChildrenCommand(Request request) {
+				return null;
+			}
+
+			protected Command getCreateCommand(CreateRequest request) {
+				return null;
+			}
+		};
+		return lep;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createNodeShape() {
+		return primaryShape = new RhombusFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public RhombusFigure getPrimaryShape() {
+		return (RhombusFigure) primaryShape;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected NodeFigure createNodePlate() {
+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);
+		return result;
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected NodeFigure createNodeFigure() {
+		NodeFigure figure = createNodePlate();
+		figure.setLayoutManager(new StackLayout());
+		IFigure shape = createNodeShape();
+		figure.add(shape);
+		contentPane = setupContentPane(shape);
+		return figure;
+	}
+
+	/**
+	 * Default implementation treats passed figure as content pane.
+	 * Respects layout one may have set for generated figure.
+	 * @param nodeShape instance of generated figure class
+	 * @generated
+	 */
+	protected IFigure setupContentPane(IFigure nodeShape) {
+		return nodeShape; // use nodeShape itself as contentPane
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure getContentPane() {
+		if (contentPane != null) {
+			return contentPane;
+		}
+		return super.getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setForegroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setForegroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setBackgroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setBackgroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineWidth(int width) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineWidth(width);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineType(int style) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineStyle(style);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public class RhombusFigure extends ScalablePolygonShape {
+
+		/**
+		 * @generated
+		 */
+		public RhombusFigure() {
+			this.setLayoutManager(new StackLayout());
+			this.addPoint(new Point(20, 40));
+			this.addPoint(new Point(40, 20));
+			this.addPoint(new Point(20, 0));
+			this.addPoint(new Point(0, 20));
+			this.addPoint(new Point(20, 40));
+			this.setFill(true);
+			this.setLineWidth(2);
+			this.setForegroundColor(ColorConstants.yellow);
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/RhombusEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/RhombusEditPart.java
new file mode 100644
index 0000000..e4c862a
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/parts/RhombusEditPart.java
@@ -0,0 +1,204 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ScalablePolygonShape;
+import org.eclipse.draw2d.Shape;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.RhombusItemSemanticEditPolicy;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @generated
+ */
+public class RhombusEditPart extends ShapeNodeEditPart {
+
+	/**
+	 * @generated
+	 */
+	public static final int VISUAL_ID = 2004;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure contentPane;
+
+	/**
+	 * @generated
+	 */
+	protected IFigure primaryShape;
+
+	/**
+	 * @generated
+	 */
+	public RhombusEditPart(View view) {
+		super(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new RhombusItemSemanticEditPolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies
+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected LayoutEditPolicy createLayoutEditPolicy() {
+		org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy lep = new org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy() {
+
+			protected EditPolicy createChildEditPolicy(EditPart child) {
+				EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
+				if (result == null) {
+					result = new NonResizableEditPolicy();
+				}
+				return result;
+			}
+
+			protected Command getMoveChildrenCommand(Request request) {
+				return null;
+			}
+
+			protected Command getCreateCommand(CreateRequest request) {
+				return null;
+			}
+		};
+		return lep;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createNodeShape() {
+		return primaryShape = new RhombusFigure();
+	}
+
+	/**
+	 * @generated
+	 */
+	public RhombusFigure getPrimaryShape() {
+		return (RhombusFigure) primaryShape;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected NodeFigure createNodePlate() {
+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);
+		return result;
+	}
+
+	/**
+	 * Creates figure for this edit part.
+	 * 
+	 * Body of this method does not depend on settings in generation model
+	 * so you may safely remove <i>generated</i> tag and modify it.
+	 * 
+	 * @generated
+	 */
+	protected NodeFigure createNodeFigure() {
+		NodeFigure figure = createNodePlate();
+		figure.setLayoutManager(new StackLayout());
+		IFigure shape = createNodeShape();
+		figure.add(shape);
+		contentPane = setupContentPane(shape);
+		return figure;
+	}
+
+	/**
+	 * Default implementation treats passed figure as content pane.
+	 * Respects layout one may have set for generated figure.
+	 * @param nodeShape instance of generated figure class
+	 * @generated
+	 */
+	protected IFigure setupContentPane(IFigure nodeShape) {
+		return nodeShape; // use nodeShape itself as contentPane
+	}
+
+	/**
+	 * @generated
+	 */
+	public IFigure getContentPane() {
+		if (contentPane != null) {
+			return contentPane;
+		}
+		return super.getContentPane();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setForegroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setForegroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setBackgroundColor(Color color) {
+		if (primaryShape != null) {
+			primaryShape.setBackgroundColor(color);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineWidth(int width) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineWidth(width);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setLineType(int style) {
+		if (primaryShape instanceof Shape) {
+			((Shape) primaryShape).setLineStyle(style);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public class RhombusFigure extends ScalablePolygonShape {
+
+		/**
+		 * @generated
+		 */
+		public RhombusFigure() {
+			this.setLayoutManager(new StackLayout());
+			this.addPoint(new Point(20, 40));
+			this.addPoint(new Point(40, 20));
+			this.addPoint(new Point(20, 0));
+			this.addPoint(new Point(0, 20));
+			this.addPoint(new Point(20, 40));
+			this.setFill(true);
+			this.setLineWidth(2);
+			this.setForegroundColor(ColorConstants.yellow);
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/CanvasCanonicalEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/CanvasCanonicalEditPolicy.java
new file mode 100644
index 0000000..8c4440a
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/CanvasCanonicalEditPolicy.java
@@ -0,0 +1,432 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;
+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
+import org.eclipse.gmf.runtime.diagram.ui.commands.SetViewMutabilityCommand;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfPackage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramUpdater;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfLinkDescriptor;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfNodeDescriptor;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.runtime.update.UpdaterLinkDescriptor;
+
+/**
+ * @generated
+ */
+public class CanvasCanonicalEditPolicy extends CanonicalEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	protected void refreshOnActivate() {
+		// Need to activate editpart children before invoking the canonical refresh for EditParts to add event listeners
+		List<?> c = getHost().getChildren();
+		for (int i = 0; i < c.size(); i++) {
+			((EditPart) c.get(i)).activate();
+		}
+		super.refreshOnActivate();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EStructuralFeature getFeatureToSynchronize() {
+		return LinklfPackage.eINSTANCE.getCanvasElementContainer_Elements();
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	protected List getSemanticChildrenList() {
+		View viewObject = (View) getHost().getModel();
+		LinkedList<EObject> result = new LinkedList<EObject>();
+		List<LinklfNodeDescriptor> childDescriptors = LinklfDiagramUpdater.getCanvas_1000SemanticChildren(viewObject);
+		for (LinklfNodeDescriptor d : childDescriptors) {
+			result.add(d.getModelElement());
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isOrphaned(Collection<EObject> semanticChildren, final View view) {
+		return isMyDiagramElement(view) && !semanticChildren.contains(view.getElement());
+	}
+
+	/**
+	 * @generated
+	 */
+	private boolean isMyDiagramElement(View view) {
+		int visualID = LinklfVisualIDRegistry.getVisualID(view);
+		switch (visualID) {
+		case CircleEditPart.VISUAL_ID:
+		case RectangleEditPart.VISUAL_ID:
+		case ContainerEditPart.VISUAL_ID:
+		case RhombusEditPart.VISUAL_ID:
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshSemantic() {
+		if (resolveSemanticElement() == null) {
+			return;
+		}
+		LinkedList<IAdaptable> createdViews = new LinkedList<IAdaptable>();
+		List<LinklfNodeDescriptor> childDescriptors = LinklfDiagramUpdater.getCanvas_1000SemanticChildren((View) getHost().getModel());
+		LinkedList<View> orphaned = new LinkedList<View>();
+		// we care to check only views we recognize as ours
+		LinkedList<View> knownViewChildren = new LinkedList<View>();
+		for (View v : getViewChildren()) {
+			if (isMyDiagramElement(v)) {
+				knownViewChildren.add(v);
+			}
+		}
+		// alternative to #cleanCanonicalSemanticChildren(getViewChildren(), semanticChildren)
+		//
+		// iteration happens over list of desired semantic elements, trying to find best matching View, while original CEP
+		// iterates views, potentially losing view (size/bounds) information - i.e. if there are few views to reference same EObject, only last one 
+		// to answer isOrphaned == true will be used for the domain element representation, see #cleanCanonicalSemanticChildren()
+		for (Iterator<LinklfNodeDescriptor> descriptorsIterator = childDescriptors.iterator(); descriptorsIterator.hasNext();) {
+			LinklfNodeDescriptor next = descriptorsIterator.next();
+			String hint = LinklfVisualIDRegistry.getType(next.getVisualID());
+			LinkedList<View> perfectMatch = new LinkedList<View>(); // both semanticElement and hint match that of NodeDescriptor
+			for (View childView : getViewChildren()) {
+				EObject semanticElement = childView.getElement();
+				if (next.getModelElement().equals(semanticElement)) {
+					if (hint.equals(childView.getType())) {
+						perfectMatch.add(childView);
+						// actually, can stop iteration over view children here, but
+						// may want to use not the first view but last one as a 'real' match (the way original CEP does
+						// with its trick with viewToSemanticMap inside #cleanCanonicalSemanticChildren
+					}
+				}
+			}
+			if (perfectMatch.size() > 0) {
+				descriptorsIterator.remove(); // precise match found no need to create anything for the NodeDescriptor
+				// use only one view (first or last?), keep rest as orphaned for further consideration
+				knownViewChildren.remove(perfectMatch.getFirst());
+			}
+		}
+		// those left in knownViewChildren are subject to removal - they are our diagram elements we didn't find match to,
+		// or those we have potential matches to, and thus need to be recreated, preserving size/location information.
+		orphaned.addAll(knownViewChildren);
+		//
+		ArrayList<CreateViewRequest.ViewDescriptor> viewDescriptors = new ArrayList<CreateViewRequest.ViewDescriptor>(childDescriptors.size());
+		for (LinklfNodeDescriptor next : childDescriptors) {
+			String hint = LinklfVisualIDRegistry.getType(next.getVisualID());
+			IAdaptable elementAdapter = new CanonicalElementAdapter(next.getModelElement(), hint);
+			CreateViewRequest.ViewDescriptor descriptor = new CreateViewRequest.ViewDescriptor(elementAdapter, Node.class, hint, ViewUtil.APPEND, false, host().getDiagramPreferencesHint());
+			viewDescriptors.add(descriptor);
+		}
+
+		boolean changed = deleteViews(orphaned.iterator());
+		//
+		CreateViewRequest request = getCreateViewRequest(viewDescriptors);
+		Command cmd = getCreateViewCommand(request);
+		if (cmd != null && cmd.canExecute()) {
+			SetViewMutabilityCommand.makeMutable(new EObjectAdapter(host().getNotationView())).execute();
+			executeCommand(cmd);
+			@SuppressWarnings("unchecked")
+			List<IAdaptable> nl = (List<IAdaptable>) request.getNewObject();
+			createdViews.addAll(nl);
+		}
+		if (changed || createdViews.size() > 0) {
+			postProcessRefreshSemantic(createdViews);
+		}
+
+		Collection<IAdaptable> createdConnectionViews = refreshConnections();
+
+		if (createdViews.size() > 1) {
+			// perform a layout of the container
+			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host().getEditingDomain(), createdViews, host());
+			executeCommand(new ICommandProxy(layoutCmd));
+		}
+
+		createdViews.addAll(createdConnectionViews);
+
+		makeViewsImmutable(createdViews);
+	}
+
+	/**
+	 * @generated
+	 */
+	private Collection<IAdaptable> refreshConnections() {
+		Domain2Notation domain2NotationMap = new Domain2Notation();
+		Collection<LinklfLinkDescriptor> linkDescriptors = collectAllLinks(getDiagram(), domain2NotationMap);
+		Collection existingLinks = new LinkedList(getDiagram().getEdges());
+		for (Iterator linksIterator = existingLinks.iterator(); linksIterator.hasNext();) {
+			Edge nextDiagramLink = (Edge) linksIterator.next();
+			int diagramLinkVisualID = LinklfVisualIDRegistry.getVisualID(nextDiagramLink);
+			if (diagramLinkVisualID == -1) {
+				if (nextDiagramLink.getSource() != null && nextDiagramLink.getTarget() != null) {
+					linksIterator.remove();
+				}
+				continue;
+			}
+			EObject diagramLinkObject = nextDiagramLink.getElement();
+			EObject diagramLinkSrc = nextDiagramLink.getSource().getElement();
+			EObject diagramLinkDst = nextDiagramLink.getTarget().getElement();
+			for (Iterator<LinklfLinkDescriptor> linkDescriptorsIterator = linkDescriptors.iterator(); linkDescriptorsIterator.hasNext();) {
+				LinklfLinkDescriptor nextLinkDescriptor = linkDescriptorsIterator.next();
+				if (diagramLinkObject == nextLinkDescriptor.getModelElement() && diagramLinkSrc == nextLinkDescriptor.getSource() && diagramLinkDst == nextLinkDescriptor.getDestination()
+						&& diagramLinkVisualID == nextLinkDescriptor.getVisualID()) {
+					linksIterator.remove();
+					linkDescriptorsIterator.remove();
+					break;
+				}
+			}
+		}
+		deleteViews(existingLinks.iterator());
+		return createConnections(linkDescriptors, domain2NotationMap);
+	}
+
+	/**
+	 * @generated
+	 */
+	private Collection<LinklfLinkDescriptor> collectAllLinks(View view, Domain2Notation domain2NotationMap) {
+		if (!CanvasEditPart.MODEL_ID.equals(LinklfVisualIDRegistry.getModelID(view))) {
+			return Collections.emptyList();
+		}
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		switch (LinklfVisualIDRegistry.getVisualID(view)) {
+		case CanvasEditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getCanvas_1000ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case CircleEditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getCircle_2001ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case RectangleEditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getRectangle_2002ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case ContainerEditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getContainer_2003ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case RhombusEditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getRhombus_2004ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case Circle2EditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getCircle_3001ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case Container2EditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getContainer_3002ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case Rectangle2EditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getRectangle_3003ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case Rhombus2EditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getRhombus_3004ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case PortEditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getPort_3005ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case LinkEditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getLink_4001ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		case LabeledLinkEditPart.VISUAL_ID: {
+			if (!domain2NotationMap.containsKey(view.getElement())) {
+				result.addAll(LinklfDiagramUpdater.getLabeledLink_4002ContainedLinks(view));
+			}
+			domain2NotationMap.putView(view.getElement(), view);
+			break;
+		}
+		}
+		for (Iterator children = view.getChildren().iterator(); children.hasNext();) {
+			result.addAll(collectAllLinks((View) children.next(), domain2NotationMap));
+		}
+		for (Iterator edges = view.getSourceEdges().iterator(); edges.hasNext();) {
+			result.addAll(collectAllLinks((View) edges.next(), domain2NotationMap));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private Collection<IAdaptable> createConnections(Collection<LinklfLinkDescriptor> linkDescriptors, Domain2Notation domain2NotationMap) {
+		LinkedList<IAdaptable> adapters = new LinkedList<IAdaptable>();
+		for (LinklfLinkDescriptor nextLinkDescriptor : linkDescriptors) {
+			EditPart sourceEditPart = getSourceEditPart(nextLinkDescriptor, domain2NotationMap);
+			EditPart targetEditPart = getTargetEditPart(nextLinkDescriptor, domain2NotationMap);
+			if (sourceEditPart == null || targetEditPart == null) {
+				continue;
+			}
+			CreateConnectionViewRequest.ConnectionViewDescriptor descriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor(nextLinkDescriptor.getSemanticAdapter(),
+					LinklfVisualIDRegistry.getType(nextLinkDescriptor.getVisualID()), ViewUtil.APPEND, false, ((IGraphicalEditPart) getHost()).getDiagramPreferencesHint());
+			CreateConnectionViewRequest ccr = new CreateConnectionViewRequest(descriptor);
+			ccr.setType(RequestConstants.REQ_CONNECTION_START);
+			ccr.setSourceEditPart(sourceEditPart);
+			sourceEditPart.getCommand(ccr);
+			ccr.setTargetEditPart(targetEditPart);
+			ccr.setType(RequestConstants.REQ_CONNECTION_END);
+			Command cmd = targetEditPart.getCommand(ccr);
+			if (cmd != null && cmd.canExecute()) {
+				executeCommand(cmd);
+				IAdaptable viewAdapter = (IAdaptable) ccr.getNewObject();
+				if (viewAdapter != null) {
+					adapters.add(viewAdapter);
+				}
+			}
+		}
+		return adapters;
+	}
+
+	/**
+	 * @generated
+	 */
+	private EditPart getEditPart(EObject domainModelElement, Domain2Notation domain2NotationMap) {
+		View view = (View) domain2NotationMap.get(domainModelElement);
+		if (view != null) {
+			return (EditPart) getHost().getViewer().getEditPartRegistry().get(view);
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	private Diagram getDiagram() {
+		return ((View) getHost().getModel()).getDiagram();
+	}
+
+	/**
+	 * @generated
+	 */
+	private EditPart getSourceEditPart(UpdaterLinkDescriptor descriptor, Domain2Notation domain2NotationMap) {
+		return getEditPart(descriptor.getSource(), domain2NotationMap);
+	}
+
+	/**
+	 * @generated
+	 */
+	private EditPart getTargetEditPart(UpdaterLinkDescriptor descriptor, Domain2Notation domain2NotationMap) {
+		return getEditPart(descriptor.getDestination(), domain2NotationMap);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected final EditPart getHintedEditPart(EObject domainModelElement, Domain2Notation domain2NotationMap, int hintVisualId) {
+		View view = (View) domain2NotationMap.getHinted(domainModelElement, LinklfVisualIDRegistry.getType(hintVisualId));
+		if (view != null) {
+			return (EditPart) getHost().getViewer().getEditPartRegistry().get(view);
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("serial")
+	protected static class Domain2Notation extends HashMap<EObject, View> {
+
+		/**
+		 * @generated
+		 */
+		public boolean containsDomainElement(EObject domainElement) {
+			return this.containsKey(domainElement);
+		}
+
+		/**
+		 * @generated
+		 */
+		public View getHinted(EObject domainEObject, String hint) {
+			return this.get(domainEObject);
+		}
+
+		/**
+		 * @generated
+		 */
+		public void putView(EObject domainElement, View view) {
+			if (!containsKey(view.getElement())) {
+				this.put(domainElement, view);
+			}
+		}
+
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/CanvasItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/CanvasItemSemanticEditPolicy.java
new file mode 100644
index 0000000..ce4067c
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/CanvasItemSemanticEditPolicy.java
@@ -0,0 +1,68 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.emf.commands.core.commands.DuplicateEObjectsCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DuplicateElementsRequest;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.CircleCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.ContainerCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.RectangleCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.RhombusCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class CanvasItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public CanvasItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Canvas_1000);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateCommand(CreateElementRequest req) {
+		if (LinklfElementTypes.Circle_2001 == req.getElementType()) {
+			return getGEFWrapper(new CircleCreateCommand(req));
+		}
+		if (LinklfElementTypes.Rectangle_2002 == req.getElementType()) {
+			return getGEFWrapper(new RectangleCreateCommand(req));
+		}
+		if (LinklfElementTypes.Container_2003 == req.getElementType()) {
+			return getGEFWrapper(new ContainerCreateCommand(req));
+		}
+		if (LinklfElementTypes.Rhombus_2004 == req.getElementType()) {
+			return getGEFWrapper(new RhombusCreateCommand(req));
+		}
+		return super.getCreateCommand(req);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDuplicateCommand(DuplicateElementsRequest req) {
+		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost()).getEditingDomain();
+		return getGEFWrapper(new DuplicateAnythingCommand(editingDomain, req));
+	}
+
+	/**
+	 * @generated
+	 */
+	private static class DuplicateAnythingCommand extends DuplicateEObjectsCommand {
+
+		/**
+		 * @generated
+		 */
+		public DuplicateAnythingCommand(TransactionalEditingDomain editingDomain, DuplicateElementsRequest req) {
+			super(editingDomain, req.getLabel(), req.getElementsToBeDuplicated(), req.getAllDuplicatedElementsMap());
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Circle2ItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Circle2ItemSemanticEditPolicy.java
new file mode 100644
index 0000000..1b2b88b
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Circle2ItemSemanticEditPolicy.java
@@ -0,0 +1,135 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class Circle2ItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public Circle2ItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Circle_3001);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		View view = (View) getHost().getModel();
+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(getEditingDomain(), null);
+		cmd.setTransactionNestingEnabled(false);
+		for (Iterator<?> it = view.getTargetEdges().iterator(); it.hasNext();) {
+			Edge incomingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+		}
+		for (Iterator<?> it = view.getSourceEdges().iterator(); it.hasNext();) {
+			Edge outgoingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+		}
+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
+		if (annotation == null) {
+			// there are indirectly referenced children, need extra commands: false
+			addDestroyShortcutsCommand(cmd, view);
+			// delete host element
+			cmd.add(new DestroyElementCommand(req));
+		} else {
+			cmd.add(new DeleteCommand(getEditingDomain(), view));
+		}
+		return getGEFWrapper(cmd.reduce());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
+		Command command = req.getTarget() == null ? getStartCreateRelationshipCommand(req) : getCompleteCreateRelationshipCommand(req);
+		return command != null ? command : super.getCreateRelationshipCommand(req);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getStartCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCompleteCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * Returns command to reorient EClass based link. New link target or source
+	 * should be the domain model element associated with this node.
+	 * 
+	 * @generated
+	 */
+	protected Command getReorientRelationshipCommand(ReorientRelationshipRequest req) {
+		switch (getVisualID(req)) {
+		case LinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LinkReorientCommand(req));
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LabeledLinkReorientCommand(req));
+		}
+		return super.getReorientRelationshipCommand(req);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/CircleItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/CircleItemSemanticEditPolicy.java
new file mode 100644
index 0000000..a1b0e94
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/CircleItemSemanticEditPolicy.java
@@ -0,0 +1,135 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class CircleItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public CircleItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Circle_2001);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		View view = (View) getHost().getModel();
+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(getEditingDomain(), null);
+		cmd.setTransactionNestingEnabled(false);
+		for (Iterator<?> it = view.getTargetEdges().iterator(); it.hasNext();) {
+			Edge incomingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+		}
+		for (Iterator<?> it = view.getSourceEdges().iterator(); it.hasNext();) {
+			Edge outgoingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+		}
+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
+		if (annotation == null) {
+			// there are indirectly referenced children, need extra commands: false
+			addDestroyShortcutsCommand(cmd, view);
+			// delete host element
+			cmd.add(new DestroyElementCommand(req));
+		} else {
+			cmd.add(new DeleteCommand(getEditingDomain(), view));
+		}
+		return getGEFWrapper(cmd.reduce());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
+		Command command = req.getTarget() == null ? getStartCreateRelationshipCommand(req) : getCompleteCreateRelationshipCommand(req);
+		return command != null ? command : super.getCreateRelationshipCommand(req);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getStartCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCompleteCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * Returns command to reorient EClass based link. New link target or source
+	 * should be the domain model element associated with this node.
+	 * 
+	 * @generated
+	 */
+	protected Command getReorientRelationshipCommand(ReorientRelationshipRequest req) {
+		switch (getVisualID(req)) {
+		case LinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LinkReorientCommand(req));
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LabeledLinkReorientCommand(req));
+		}
+		return super.getReorientRelationshipCommand(req);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Container2CanonicalEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Container2CanonicalEditPolicy.java
new file mode 100644
index 0000000..9d1ee1a
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Container2CanonicalEditPolicy.java
@@ -0,0 +1,158 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;
+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
+import org.eclipse.gmf.runtime.diagram.ui.commands.SetViewMutabilityCommand;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfPackage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramUpdater;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfNodeDescriptor;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+
+/**
+ * @generated
+ */
+public class Container2CanonicalEditPolicy extends CanonicalEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	protected void refreshOnActivate() {
+		// Need to activate editpart children before invoking the canonical refresh for EditParts to add event listeners
+		List<?> c = getHost().getChildren();
+		for (int i = 0; i < c.size(); i++) {
+			((EditPart) c.get(i)).activate();
+		}
+		super.refreshOnActivate();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EStructuralFeature getFeatureToSynchronize() {
+		return LinklfPackage.eINSTANCE.getContainer_Porst();
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	protected List getSemanticChildrenList() {
+		View viewObject = (View) getHost().getModel();
+		LinkedList<EObject> result = new LinkedList<EObject>();
+		List<LinklfNodeDescriptor> childDescriptors = LinklfDiagramUpdater.getContainer_3002SemanticChildren(viewObject);
+		for (LinklfNodeDescriptor d : childDescriptors) {
+			result.add(d.getModelElement());
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isOrphaned(Collection<EObject> semanticChildren, final View view) {
+		return isMyDiagramElement(view) && !semanticChildren.contains(view.getElement());
+	}
+
+	/**
+	 * @generated
+	 */
+	private boolean isMyDiagramElement(View view) {
+		return PortEditPart.VISUAL_ID == LinklfVisualIDRegistry.getVisualID(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshSemantic() {
+		if (resolveSemanticElement() == null) {
+			return;
+		}
+		LinkedList<IAdaptable> createdViews = new LinkedList<IAdaptable>();
+		List<LinklfNodeDescriptor> childDescriptors = LinklfDiagramUpdater.getContainer_3002SemanticChildren((View) getHost().getModel());
+		LinkedList<View> orphaned = new LinkedList<View>();
+		// we care to check only views we recognize as ours
+		LinkedList<View> knownViewChildren = new LinkedList<View>();
+		for (View v : getViewChildren()) {
+			if (isMyDiagramElement(v)) {
+				knownViewChildren.add(v);
+			}
+		}
+		// alternative to #cleanCanonicalSemanticChildren(getViewChildren(), semanticChildren)
+		//
+		// iteration happens over list of desired semantic elements, trying to find best matching View, while original CEP
+		// iterates views, potentially losing view (size/bounds) information - i.e. if there are few views to reference same EObject, only last one 
+		// to answer isOrphaned == true will be used for the domain element representation, see #cleanCanonicalSemanticChildren()
+		for (Iterator<LinklfNodeDescriptor> descriptorsIterator = childDescriptors.iterator(); descriptorsIterator.hasNext();) {
+			LinklfNodeDescriptor next = descriptorsIterator.next();
+			String hint = LinklfVisualIDRegistry.getType(next.getVisualID());
+			LinkedList<View> perfectMatch = new LinkedList<View>(); // both semanticElement and hint match that of NodeDescriptor
+			for (View childView : getViewChildren()) {
+				EObject semanticElement = childView.getElement();
+				if (next.getModelElement().equals(semanticElement)) {
+					if (hint.equals(childView.getType())) {
+						perfectMatch.add(childView);
+						// actually, can stop iteration over view children here, but
+						// may want to use not the first view but last one as a 'real' match (the way original CEP does
+						// with its trick with viewToSemanticMap inside #cleanCanonicalSemanticChildren
+					}
+				}
+			}
+			if (perfectMatch.size() > 0) {
+				descriptorsIterator.remove(); // precise match found no need to create anything for the NodeDescriptor
+				// use only one view (first or last?), keep rest as orphaned for further consideration
+				knownViewChildren.remove(perfectMatch.getFirst());
+			}
+		}
+		// those left in knownViewChildren are subject to removal - they are our diagram elements we didn't find match to,
+		// or those we have potential matches to, and thus need to be recreated, preserving size/location information.
+		orphaned.addAll(knownViewChildren);
+		//
+		ArrayList<CreateViewRequest.ViewDescriptor> viewDescriptors = new ArrayList<CreateViewRequest.ViewDescriptor>(childDescriptors.size());
+		for (LinklfNodeDescriptor next : childDescriptors) {
+			String hint = LinklfVisualIDRegistry.getType(next.getVisualID());
+			IAdaptable elementAdapter = new CanonicalElementAdapter(next.getModelElement(), hint);
+			CreateViewRequest.ViewDescriptor descriptor = new CreateViewRequest.ViewDescriptor(elementAdapter, Node.class, hint, ViewUtil.APPEND, false, host().getDiagramPreferencesHint());
+			viewDescriptors.add(descriptor);
+		}
+
+		boolean changed = deleteViews(orphaned.iterator());
+		//
+		CreateViewRequest request = getCreateViewRequest(viewDescriptors);
+		Command cmd = getCreateViewCommand(request);
+		if (cmd != null && cmd.canExecute()) {
+			SetViewMutabilityCommand.makeMutable(new EObjectAdapter(host().getNotationView())).execute();
+			executeCommand(cmd);
+			@SuppressWarnings("unchecked")
+			List<IAdaptable> nl = (List<IAdaptable>) request.getNewObject();
+			createdViews.addAll(nl);
+		}
+		if (changed || createdViews.size() > 0) {
+			postProcessRefreshSemantic(createdViews);
+		}
+		if (createdViews.size() > 1) {
+			// perform a layout of the container
+			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host().getEditingDomain(), createdViews, host());
+			executeCommand(new ICommandProxy(layoutCmd));
+		}
+
+		makeViewsImmutable(createdViews);
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Container2ItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Container2ItemSemanticEditPolicy.java
new file mode 100644
index 0000000..68b4574
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Container2ItemSemanticEditPolicy.java
@@ -0,0 +1,234 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.common.core.command.ICompositeCommand;
+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.PortCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerContainerCompartment2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class Container2ItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public Container2ItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Container_3002);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateCommand(CreateElementRequest req) {
+		if (LinklfElementTypes.Port_3005 == req.getElementType()) {
+			return getGEFWrapper(new PortCreateCommand(req));
+		}
+		return super.getCreateCommand(req);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		View view = (View) getHost().getModel();
+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(getEditingDomain(), null);
+		cmd.setTransactionNestingEnabled(false);
+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
+		if (annotation == null) {
+			// there are indirectly referenced children, need extra commands: false
+			addDestroyChildNodesCommand(cmd);
+			addDestroyShortcutsCommand(cmd, view);
+			// delete host element
+			cmd.add(new DestroyElementCommand(req));
+		} else {
+			cmd.add(new DeleteCommand(getEditingDomain(), view));
+		}
+		return getGEFWrapper(cmd.reduce());
+	}
+
+	/**
+	 * @generated
+	 */
+	private void addDestroyChildNodesCommand(ICompositeCommand cmd) {
+		View view = (View) getHost().getModel();
+		for (Iterator<?> nit = view.getChildren().iterator(); nit.hasNext();) {
+			Node node = (Node) nit.next();
+			switch (LinklfVisualIDRegistry.getVisualID(node)) {
+			case PortEditPart.VISUAL_ID:
+				for (Iterator<?> it = node.getTargetEdges().iterator(); it.hasNext();) {
+					Edge incomingLink = (Edge) it.next();
+					if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+						DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+						cmd.add(new DestroyElementCommand(r));
+						cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+						continue;
+					}
+					if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+						DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+						cmd.add(new DestroyElementCommand(r));
+						cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+						continue;
+					}
+				}
+				for (Iterator<?> it = node.getSourceEdges().iterator(); it.hasNext();) {
+					Edge outgoingLink = (Edge) it.next();
+					if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+						DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+						cmd.add(new DestroyElementCommand(r));
+						cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+						continue;
+					}
+					if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+						DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+						cmd.add(new DestroyElementCommand(r));
+						cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+						continue;
+					}
+				}
+				cmd.add(new DestroyElementCommand(new DestroyElementRequest(getEditingDomain(), node.getElement(), false))); // directlyOwned: true
+				// don't need explicit deletion of node as parent's view deletion would clean child views as well 
+				// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), node));
+				break;
+			case ContainerContainerCompartment2EditPart.VISUAL_ID:
+				for (Iterator<?> cit = node.getChildren().iterator(); cit.hasNext();) {
+					Node cnode = (Node) cit.next();
+					switch (LinklfVisualIDRegistry.getVisualID(cnode)) {
+					case Circle2EditPart.VISUAL_ID:
+						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it.hasNext();) {
+							Edge incomingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+						}
+						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it.hasNext();) {
+							Edge outgoingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+						}
+						cmd.add(new DestroyElementCommand(new DestroyElementRequest(getEditingDomain(), cnode.getElement(), false))); // directlyOwned: true
+						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
+						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
+						break;
+					case Container2EditPart.VISUAL_ID:
+						cmd.add(new DestroyElementCommand(new DestroyElementRequest(getEditingDomain(), cnode.getElement(), false))); // directlyOwned: true
+						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
+						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
+						break;
+					case Rectangle2EditPart.VISUAL_ID:
+						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it.hasNext();) {
+							Edge incomingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+						}
+						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it.hasNext();) {
+							Edge outgoingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+						}
+						cmd.add(new DestroyElementCommand(new DestroyElementRequest(getEditingDomain(), cnode.getElement(), false))); // directlyOwned: true
+						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
+						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
+						break;
+					case Rhombus2EditPart.VISUAL_ID:
+						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it.hasNext();) {
+							Edge incomingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+						}
+						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it.hasNext();) {
+							Edge outgoingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+						}
+						cmd.add(new DestroyElementCommand(new DestroyElementRequest(getEditingDomain(), cnode.getElement(), false))); // directlyOwned: true
+						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
+						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
+						break;
+					}
+				}
+				break;
+			}
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerCanonicalEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerCanonicalEditPolicy.java
new file mode 100644
index 0000000..cd26e89
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerCanonicalEditPolicy.java
@@ -0,0 +1,158 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;
+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
+import org.eclipse.gmf.runtime.diagram.ui.commands.SetViewMutabilityCommand;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfPackage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramUpdater;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfNodeDescriptor;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+
+/**
+ * @generated
+ */
+public class ContainerCanonicalEditPolicy extends CanonicalEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	protected void refreshOnActivate() {
+		// Need to activate editpart children before invoking the canonical refresh for EditParts to add event listeners
+		List<?> c = getHost().getChildren();
+		for (int i = 0; i < c.size(); i++) {
+			((EditPart) c.get(i)).activate();
+		}
+		super.refreshOnActivate();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EStructuralFeature getFeatureToSynchronize() {
+		return LinklfPackage.eINSTANCE.getContainer_Porst();
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	protected List getSemanticChildrenList() {
+		View viewObject = (View) getHost().getModel();
+		LinkedList<EObject> result = new LinkedList<EObject>();
+		List<LinklfNodeDescriptor> childDescriptors = LinklfDiagramUpdater.getContainer_2003SemanticChildren(viewObject);
+		for (LinklfNodeDescriptor d : childDescriptors) {
+			result.add(d.getModelElement());
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isOrphaned(Collection<EObject> semanticChildren, final View view) {
+		return isMyDiagramElement(view) && !semanticChildren.contains(view.getElement());
+	}
+
+	/**
+	 * @generated
+	 */
+	private boolean isMyDiagramElement(View view) {
+		return PortEditPart.VISUAL_ID == LinklfVisualIDRegistry.getVisualID(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshSemantic() {
+		if (resolveSemanticElement() == null) {
+			return;
+		}
+		LinkedList<IAdaptable> createdViews = new LinkedList<IAdaptable>();
+		List<LinklfNodeDescriptor> childDescriptors = LinklfDiagramUpdater.getContainer_2003SemanticChildren((View) getHost().getModel());
+		LinkedList<View> orphaned = new LinkedList<View>();
+		// we care to check only views we recognize as ours
+		LinkedList<View> knownViewChildren = new LinkedList<View>();
+		for (View v : getViewChildren()) {
+			if (isMyDiagramElement(v)) {
+				knownViewChildren.add(v);
+			}
+		}
+		// alternative to #cleanCanonicalSemanticChildren(getViewChildren(), semanticChildren)
+		//
+		// iteration happens over list of desired semantic elements, trying to find best matching View, while original CEP
+		// iterates views, potentially losing view (size/bounds) information - i.e. if there are few views to reference same EObject, only last one 
+		// to answer isOrphaned == true will be used for the domain element representation, see #cleanCanonicalSemanticChildren()
+		for (Iterator<LinklfNodeDescriptor> descriptorsIterator = childDescriptors.iterator(); descriptorsIterator.hasNext();) {
+			LinklfNodeDescriptor next = descriptorsIterator.next();
+			String hint = LinklfVisualIDRegistry.getType(next.getVisualID());
+			LinkedList<View> perfectMatch = new LinkedList<View>(); // both semanticElement and hint match that of NodeDescriptor
+			for (View childView : getViewChildren()) {
+				EObject semanticElement = childView.getElement();
+				if (next.getModelElement().equals(semanticElement)) {
+					if (hint.equals(childView.getType())) {
+						perfectMatch.add(childView);
+						// actually, can stop iteration over view children here, but
+						// may want to use not the first view but last one as a 'real' match (the way original CEP does
+						// with its trick with viewToSemanticMap inside #cleanCanonicalSemanticChildren
+					}
+				}
+			}
+			if (perfectMatch.size() > 0) {
+				descriptorsIterator.remove(); // precise match found no need to create anything for the NodeDescriptor
+				// use only one view (first or last?), keep rest as orphaned for further consideration
+				knownViewChildren.remove(perfectMatch.getFirst());
+			}
+		}
+		// those left in knownViewChildren are subject to removal - they are our diagram elements we didn't find match to,
+		// or those we have potential matches to, and thus need to be recreated, preserving size/location information.
+		orphaned.addAll(knownViewChildren);
+		//
+		ArrayList<CreateViewRequest.ViewDescriptor> viewDescriptors = new ArrayList<CreateViewRequest.ViewDescriptor>(childDescriptors.size());
+		for (LinklfNodeDescriptor next : childDescriptors) {
+			String hint = LinklfVisualIDRegistry.getType(next.getVisualID());
+			IAdaptable elementAdapter = new CanonicalElementAdapter(next.getModelElement(), hint);
+			CreateViewRequest.ViewDescriptor descriptor = new CreateViewRequest.ViewDescriptor(elementAdapter, Node.class, hint, ViewUtil.APPEND, false, host().getDiagramPreferencesHint());
+			viewDescriptors.add(descriptor);
+		}
+
+		boolean changed = deleteViews(orphaned.iterator());
+		//
+		CreateViewRequest request = getCreateViewRequest(viewDescriptors);
+		Command cmd = getCreateViewCommand(request);
+		if (cmd != null && cmd.canExecute()) {
+			SetViewMutabilityCommand.makeMutable(new EObjectAdapter(host().getNotationView())).execute();
+			executeCommand(cmd);
+			@SuppressWarnings("unchecked")
+			List<IAdaptable> nl = (List<IAdaptable>) request.getNewObject();
+			createdViews.addAll(nl);
+		}
+		if (changed || createdViews.size() > 0) {
+			postProcessRefreshSemantic(createdViews);
+		}
+		if (createdViews.size() > 1) {
+			// perform a layout of the container
+			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host().getEditingDomain(), createdViews, host());
+			executeCommand(new ICommandProxy(layoutCmd));
+		}
+
+		makeViewsImmutable(createdViews);
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartment2CanonicalEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartment2CanonicalEditPolicy.java
new file mode 100644
index 0000000..ea869db
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartment2CanonicalEditPolicy.java
@@ -0,0 +1,169 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;
+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
+import org.eclipse.gmf.runtime.diagram.ui.commands.SetViewMutabilityCommand;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfPackage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramUpdater;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfNodeDescriptor;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+
+/**
+ * @generated
+ */
+public class ContainerContainerCompartment2CanonicalEditPolicy extends CanonicalEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	protected void refreshOnActivate() {
+		// Need to activate editpart children before invoking the canonical refresh for EditParts to add event listeners
+		List<?> c = getHost().getChildren();
+		for (int i = 0; i < c.size(); i++) {
+			((EditPart) c.get(i)).activate();
+		}
+		super.refreshOnActivate();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EStructuralFeature getFeatureToSynchronize() {
+		return LinklfPackage.eINSTANCE.getCanvasElementContainer_Elements();
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	protected List getSemanticChildrenList() {
+		View viewObject = (View) getHost().getModel();
+		LinkedList<EObject> result = new LinkedList<EObject>();
+		List<LinklfNodeDescriptor> childDescriptors = LinklfDiagramUpdater.getContainerContainerCompartment_7002SemanticChildren(viewObject);
+		for (LinklfNodeDescriptor d : childDescriptors) {
+			result.add(d.getModelElement());
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isOrphaned(Collection<EObject> semanticChildren, final View view) {
+		return isMyDiagramElement(view) && !semanticChildren.contains(view.getElement());
+	}
+
+	/**
+	 * @generated
+	 */
+	private boolean isMyDiagramElement(View view) {
+		int visualID = LinklfVisualIDRegistry.getVisualID(view);
+		switch (visualID) {
+		case Circle2EditPart.VISUAL_ID:
+		case Container2EditPart.VISUAL_ID:
+		case Rectangle2EditPart.VISUAL_ID:
+		case Rhombus2EditPart.VISUAL_ID:
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshSemantic() {
+		if (resolveSemanticElement() == null) {
+			return;
+		}
+		LinkedList<IAdaptable> createdViews = new LinkedList<IAdaptable>();
+		List<LinklfNodeDescriptor> childDescriptors = LinklfDiagramUpdater.getContainerContainerCompartment_7002SemanticChildren((View) getHost().getModel());
+		LinkedList<View> orphaned = new LinkedList<View>();
+		// we care to check only views we recognize as ours
+		LinkedList<View> knownViewChildren = new LinkedList<View>();
+		for (View v : getViewChildren()) {
+			if (isMyDiagramElement(v)) {
+				knownViewChildren.add(v);
+			}
+		}
+		// alternative to #cleanCanonicalSemanticChildren(getViewChildren(), semanticChildren)
+		//
+		// iteration happens over list of desired semantic elements, trying to find best matching View, while original CEP
+		// iterates views, potentially losing view (size/bounds) information - i.e. if there are few views to reference same EObject, only last one 
+		// to answer isOrphaned == true will be used for the domain element representation, see #cleanCanonicalSemanticChildren()
+		for (Iterator<LinklfNodeDescriptor> descriptorsIterator = childDescriptors.iterator(); descriptorsIterator.hasNext();) {
+			LinklfNodeDescriptor next = descriptorsIterator.next();
+			String hint = LinklfVisualIDRegistry.getType(next.getVisualID());
+			LinkedList<View> perfectMatch = new LinkedList<View>(); // both semanticElement and hint match that of NodeDescriptor
+			for (View childView : getViewChildren()) {
+				EObject semanticElement = childView.getElement();
+				if (next.getModelElement().equals(semanticElement)) {
+					if (hint.equals(childView.getType())) {
+						perfectMatch.add(childView);
+						// actually, can stop iteration over view children here, but
+						// may want to use not the first view but last one as a 'real' match (the way original CEP does
+						// with its trick with viewToSemanticMap inside #cleanCanonicalSemanticChildren
+					}
+				}
+			}
+			if (perfectMatch.size() > 0) {
+				descriptorsIterator.remove(); // precise match found no need to create anything for the NodeDescriptor
+				// use only one view (first or last?), keep rest as orphaned for further consideration
+				knownViewChildren.remove(perfectMatch.getFirst());
+			}
+		}
+		// those left in knownViewChildren are subject to removal - they are our diagram elements we didn't find match to,
+		// or those we have potential matches to, and thus need to be recreated, preserving size/location information.
+		orphaned.addAll(knownViewChildren);
+		//
+		ArrayList<CreateViewRequest.ViewDescriptor> viewDescriptors = new ArrayList<CreateViewRequest.ViewDescriptor>(childDescriptors.size());
+		for (LinklfNodeDescriptor next : childDescriptors) {
+			String hint = LinklfVisualIDRegistry.getType(next.getVisualID());
+			IAdaptable elementAdapter = new CanonicalElementAdapter(next.getModelElement(), hint);
+			CreateViewRequest.ViewDescriptor descriptor = new CreateViewRequest.ViewDescriptor(elementAdapter, Node.class, hint, ViewUtil.APPEND, false, host().getDiagramPreferencesHint());
+			viewDescriptors.add(descriptor);
+		}
+
+		boolean changed = deleteViews(orphaned.iterator());
+		//
+		CreateViewRequest request = getCreateViewRequest(viewDescriptors);
+		Command cmd = getCreateViewCommand(request);
+		if (cmd != null && cmd.canExecute()) {
+			SetViewMutabilityCommand.makeMutable(new EObjectAdapter(host().getNotationView())).execute();
+			executeCommand(cmd);
+			@SuppressWarnings("unchecked")
+			List<IAdaptable> nl = (List<IAdaptable>) request.getNewObject();
+			createdViews.addAll(nl);
+		}
+		if (changed || createdViews.size() > 0) {
+			postProcessRefreshSemantic(createdViews);
+		}
+		if (createdViews.size() > 1) {
+			// perform a layout of the container
+			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host().getEditingDomain(), createdViews, host());
+			executeCommand(new ICommandProxy(layoutCmd));
+		}
+
+		makeViewsImmutable(createdViews);
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartment2ItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartment2ItemSemanticEditPolicy.java
new file mode 100644
index 0000000..8c1ea7a
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartment2ItemSemanticEditPolicy.java
@@ -0,0 +1,42 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.Circle2CreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.Container2CreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.Rectangle2CreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.Rhombus2CreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class ContainerContainerCompartment2ItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public ContainerContainerCompartment2ItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Container_3002);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateCommand(CreateElementRequest req) {
+		if (LinklfElementTypes.Circle_3001 == req.getElementType()) {
+			return getGEFWrapper(new Circle2CreateCommand(req));
+		}
+		if (LinklfElementTypes.Container_3002 == req.getElementType()) {
+			return getGEFWrapper(new Container2CreateCommand(req));
+		}
+		if (LinklfElementTypes.Rectangle_3003 == req.getElementType()) {
+			return getGEFWrapper(new Rectangle2CreateCommand(req));
+		}
+		if (LinklfElementTypes.Rhombus_3004 == req.getElementType()) {
+			return getGEFWrapper(new Rhombus2CreateCommand(req));
+		}
+		return super.getCreateCommand(req);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartmentCanonicalEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartmentCanonicalEditPolicy.java
new file mode 100644
index 0000000..f32cf0b
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartmentCanonicalEditPolicy.java
@@ -0,0 +1,169 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;
+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
+import org.eclipse.gmf.runtime.diagram.ui.commands.SetViewMutabilityCommand;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfPackage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramUpdater;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfNodeDescriptor;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+
+/**
+ * @generated
+ */
+public class ContainerContainerCompartmentCanonicalEditPolicy extends CanonicalEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	protected void refreshOnActivate() {
+		// Need to activate editpart children before invoking the canonical refresh for EditParts to add event listeners
+		List<?> c = getHost().getChildren();
+		for (int i = 0; i < c.size(); i++) {
+			((EditPart) c.get(i)).activate();
+		}
+		super.refreshOnActivate();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EStructuralFeature getFeatureToSynchronize() {
+		return LinklfPackage.eINSTANCE.getCanvasElementContainer_Elements();
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	protected List getSemanticChildrenList() {
+		View viewObject = (View) getHost().getModel();
+		LinkedList<EObject> result = new LinkedList<EObject>();
+		List<LinklfNodeDescriptor> childDescriptors = LinklfDiagramUpdater.getContainerContainerCompartment_7001SemanticChildren(viewObject);
+		for (LinklfNodeDescriptor d : childDescriptors) {
+			result.add(d.getModelElement());
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isOrphaned(Collection<EObject> semanticChildren, final View view) {
+		return isMyDiagramElement(view) && !semanticChildren.contains(view.getElement());
+	}
+
+	/**
+	 * @generated
+	 */
+	private boolean isMyDiagramElement(View view) {
+		int visualID = LinklfVisualIDRegistry.getVisualID(view);
+		switch (visualID) {
+		case Circle2EditPart.VISUAL_ID:
+		case Container2EditPart.VISUAL_ID:
+		case Rectangle2EditPart.VISUAL_ID:
+		case Rhombus2EditPart.VISUAL_ID:
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshSemantic() {
+		if (resolveSemanticElement() == null) {
+			return;
+		}
+		LinkedList<IAdaptable> createdViews = new LinkedList<IAdaptable>();
+		List<LinklfNodeDescriptor> childDescriptors = LinklfDiagramUpdater.getContainerContainerCompartment_7001SemanticChildren((View) getHost().getModel());
+		LinkedList<View> orphaned = new LinkedList<View>();
+		// we care to check only views we recognize as ours
+		LinkedList<View> knownViewChildren = new LinkedList<View>();
+		for (View v : getViewChildren()) {
+			if (isMyDiagramElement(v)) {
+				knownViewChildren.add(v);
+			}
+		}
+		// alternative to #cleanCanonicalSemanticChildren(getViewChildren(), semanticChildren)
+		//
+		// iteration happens over list of desired semantic elements, trying to find best matching View, while original CEP
+		// iterates views, potentially losing view (size/bounds) information - i.e. if there are few views to reference same EObject, only last one 
+		// to answer isOrphaned == true will be used for the domain element representation, see #cleanCanonicalSemanticChildren()
+		for (Iterator<LinklfNodeDescriptor> descriptorsIterator = childDescriptors.iterator(); descriptorsIterator.hasNext();) {
+			LinklfNodeDescriptor next = descriptorsIterator.next();
+			String hint = LinklfVisualIDRegistry.getType(next.getVisualID());
+			LinkedList<View> perfectMatch = new LinkedList<View>(); // both semanticElement and hint match that of NodeDescriptor
+			for (View childView : getViewChildren()) {
+				EObject semanticElement = childView.getElement();
+				if (next.getModelElement().equals(semanticElement)) {
+					if (hint.equals(childView.getType())) {
+						perfectMatch.add(childView);
+						// actually, can stop iteration over view children here, but
+						// may want to use not the first view but last one as a 'real' match (the way original CEP does
+						// with its trick with viewToSemanticMap inside #cleanCanonicalSemanticChildren
+					}
+				}
+			}
+			if (perfectMatch.size() > 0) {
+				descriptorsIterator.remove(); // precise match found no need to create anything for the NodeDescriptor
+				// use only one view (first or last?), keep rest as orphaned for further consideration
+				knownViewChildren.remove(perfectMatch.getFirst());
+			}
+		}
+		// those left in knownViewChildren are subject to removal - they are our diagram elements we didn't find match to,
+		// or those we have potential matches to, and thus need to be recreated, preserving size/location information.
+		orphaned.addAll(knownViewChildren);
+		//
+		ArrayList<CreateViewRequest.ViewDescriptor> viewDescriptors = new ArrayList<CreateViewRequest.ViewDescriptor>(childDescriptors.size());
+		for (LinklfNodeDescriptor next : childDescriptors) {
+			String hint = LinklfVisualIDRegistry.getType(next.getVisualID());
+			IAdaptable elementAdapter = new CanonicalElementAdapter(next.getModelElement(), hint);
+			CreateViewRequest.ViewDescriptor descriptor = new CreateViewRequest.ViewDescriptor(elementAdapter, Node.class, hint, ViewUtil.APPEND, false, host().getDiagramPreferencesHint());
+			viewDescriptors.add(descriptor);
+		}
+
+		boolean changed = deleteViews(orphaned.iterator());
+		//
+		CreateViewRequest request = getCreateViewRequest(viewDescriptors);
+		Command cmd = getCreateViewCommand(request);
+		if (cmd != null && cmd.canExecute()) {
+			SetViewMutabilityCommand.makeMutable(new EObjectAdapter(host().getNotationView())).execute();
+			executeCommand(cmd);
+			@SuppressWarnings("unchecked")
+			List<IAdaptable> nl = (List<IAdaptable>) request.getNewObject();
+			createdViews.addAll(nl);
+		}
+		if (changed || createdViews.size() > 0) {
+			postProcessRefreshSemantic(createdViews);
+		}
+		if (createdViews.size() > 1) {
+			// perform a layout of the container
+			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host().getEditingDomain(), createdViews, host());
+			executeCommand(new ICommandProxy(layoutCmd));
+		}
+
+		makeViewsImmutable(createdViews);
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartmentItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartmentItemSemanticEditPolicy.java
new file mode 100644
index 0000000..1c3281f
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerContainerCompartmentItemSemanticEditPolicy.java
@@ -0,0 +1,42 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.Circle2CreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.Container2CreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.Rectangle2CreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.Rhombus2CreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class ContainerContainerCompartmentItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public ContainerContainerCompartmentItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Container_2003);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateCommand(CreateElementRequest req) {
+		if (LinklfElementTypes.Circle_3001 == req.getElementType()) {
+			return getGEFWrapper(new Circle2CreateCommand(req));
+		}
+		if (LinklfElementTypes.Container_3002 == req.getElementType()) {
+			return getGEFWrapper(new Container2CreateCommand(req));
+		}
+		if (LinklfElementTypes.Rectangle_3003 == req.getElementType()) {
+			return getGEFWrapper(new Rectangle2CreateCommand(req));
+		}
+		if (LinklfElementTypes.Rhombus_3004 == req.getElementType()) {
+			return getGEFWrapper(new Rhombus2CreateCommand(req));
+		}
+		return super.getCreateCommand(req);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerItemSemanticEditPolicy.java
new file mode 100644
index 0000000..150b8bc
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/ContainerItemSemanticEditPolicy.java
@@ -0,0 +1,234 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.common.core.command.ICompositeCommand;
+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.PortCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerContainerCompartmentEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class ContainerItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public ContainerItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Container_2003);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateCommand(CreateElementRequest req) {
+		if (LinklfElementTypes.Port_3005 == req.getElementType()) {
+			return getGEFWrapper(new PortCreateCommand(req));
+		}
+		return super.getCreateCommand(req);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		View view = (View) getHost().getModel();
+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(getEditingDomain(), null);
+		cmd.setTransactionNestingEnabled(false);
+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
+		if (annotation == null) {
+			// there are indirectly referenced children, need extra commands: false
+			addDestroyChildNodesCommand(cmd);
+			addDestroyShortcutsCommand(cmd, view);
+			// delete host element
+			cmd.add(new DestroyElementCommand(req));
+		} else {
+			cmd.add(new DeleteCommand(getEditingDomain(), view));
+		}
+		return getGEFWrapper(cmd.reduce());
+	}
+
+	/**
+	 * @generated
+	 */
+	private void addDestroyChildNodesCommand(ICompositeCommand cmd) {
+		View view = (View) getHost().getModel();
+		for (Iterator<?> nit = view.getChildren().iterator(); nit.hasNext();) {
+			Node node = (Node) nit.next();
+			switch (LinklfVisualIDRegistry.getVisualID(node)) {
+			case PortEditPart.VISUAL_ID:
+				for (Iterator<?> it = node.getTargetEdges().iterator(); it.hasNext();) {
+					Edge incomingLink = (Edge) it.next();
+					if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+						DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+						cmd.add(new DestroyElementCommand(r));
+						cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+						continue;
+					}
+					if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+						DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+						cmd.add(new DestroyElementCommand(r));
+						cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+						continue;
+					}
+				}
+				for (Iterator<?> it = node.getSourceEdges().iterator(); it.hasNext();) {
+					Edge outgoingLink = (Edge) it.next();
+					if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+						DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+						cmd.add(new DestroyElementCommand(r));
+						cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+						continue;
+					}
+					if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+						DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+						cmd.add(new DestroyElementCommand(r));
+						cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+						continue;
+					}
+				}
+				cmd.add(new DestroyElementCommand(new DestroyElementRequest(getEditingDomain(), node.getElement(), false))); // directlyOwned: true
+				// don't need explicit deletion of node as parent's view deletion would clean child views as well 
+				// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), node));
+				break;
+			case ContainerContainerCompartmentEditPart.VISUAL_ID:
+				for (Iterator<?> cit = node.getChildren().iterator(); cit.hasNext();) {
+					Node cnode = (Node) cit.next();
+					switch (LinklfVisualIDRegistry.getVisualID(cnode)) {
+					case Circle2EditPart.VISUAL_ID:
+						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it.hasNext();) {
+							Edge incomingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+						}
+						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it.hasNext();) {
+							Edge outgoingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+						}
+						cmd.add(new DestroyElementCommand(new DestroyElementRequest(getEditingDomain(), cnode.getElement(), false))); // directlyOwned: true
+						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
+						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
+						break;
+					case Container2EditPart.VISUAL_ID:
+						cmd.add(new DestroyElementCommand(new DestroyElementRequest(getEditingDomain(), cnode.getElement(), false))); // directlyOwned: true
+						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
+						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
+						break;
+					case Rectangle2EditPart.VISUAL_ID:
+						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it.hasNext();) {
+							Edge incomingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+						}
+						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it.hasNext();) {
+							Edge outgoingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+						}
+						cmd.add(new DestroyElementCommand(new DestroyElementRequest(getEditingDomain(), cnode.getElement(), false))); // directlyOwned: true
+						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
+						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
+						break;
+					case Rhombus2EditPart.VISUAL_ID:
+						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it.hasNext();) {
+							Edge incomingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+								continue;
+							}
+						}
+						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it.hasNext();) {
+							Edge outgoingLink = (Edge) it.next();
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+							if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+								DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+								cmd.add(new DestroyElementCommand(r));
+								cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+								continue;
+							}
+						}
+						cmd.add(new DestroyElementCommand(new DestroyElementRequest(getEditingDomain(), cnode.getElement(), false))); // directlyOwned: true
+						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
+						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
+						break;
+					}
+				}
+				break;
+			}
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LabeledLinkItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LabeledLinkItemSemanticEditPolicy.java
new file mode 100644
index 0000000..0a8c965
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LabeledLinkItemSemanticEditPolicy.java
@@ -0,0 +1,27 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class LabeledLinkItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public LabeledLinkItemSemanticEditPolicy() {
+		super(LinklfElementTypes.LabeledLink_4002);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		return getGEFWrapper(new DestroyElementCommand(req));
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinkItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinkItemSemanticEditPolicy.java
new file mode 100644
index 0000000..c464dc2
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinkItemSemanticEditPolicy.java
@@ -0,0 +1,27 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class LinkItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public LinkItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Link_4001);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		return getGEFWrapper(new DestroyElementCommand(req));
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinklfBaseItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinklfBaseItemSemanticEditPolicy.java
new file mode 100644
index 0000000..4778ab6
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinklfBaseItemSemanticEditPolicy.java
@@ -0,0 +1,335 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.UnexecutableCommand;
+import org.eclipse.gef.requests.ReconnectRequest;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.common.core.command.ICompositeCommand;
+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
+import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.SemanticEditPolicy;
+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DuplicateElementsRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.GetEditContextRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.MoveRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.LabeledLink;
+import org.eclipse.gmf.tooling.examples.linklf.Link;
+import org.eclipse.gmf.tooling.examples.linklf.Node;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.runtime.edit.helpers.GeneratedEditHelperBase;
+
+/**
+ * @generated
+ */
+public class LinklfBaseItemSemanticEditPolicy extends SemanticEditPolicy {
+
+	/**
+	 * Extended request data key to hold editpart visual id.
+	 * @generated
+	 */
+	public static final String VISUAL_ID_KEY = "visual_id"; //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	private final IElementType myElementType;
+
+	/**
+	 * @generated
+	 */
+	protected LinklfBaseItemSemanticEditPolicy(IElementType elementType) {
+		myElementType = elementType;
+	}
+
+	/**
+	 * Extended request data key to hold editpart visual id.
+	 * Add visual id of edited editpart to extended data of the request
+	 * so command switch can decide what kind of diagram element is being edited.
+	 * It is done in those cases when it's not possible to deduce diagram
+	 * element kind from domain element.
+	 * 
+	 * @generated
+	 */
+	public Command getCommand(Request request) {
+		if (request instanceof ReconnectRequest) {
+			Object view = ((ReconnectRequest) request).getConnectionEditPart().getModel();
+			if (view instanceof View) {
+				Integer id = new Integer(LinklfVisualIDRegistry.getVisualID((View) view));
+				request.getExtendedData().put(VISUAL_ID_KEY, id);
+			}
+		}
+		return super.getCommand(request);
+	}
+
+	/**
+	 * Returns visual id from request parameters.
+	 * @generated
+	 */
+	protected int getVisualID(IEditCommandRequest request) {
+		Object id = request.getParameter(VISUAL_ID_KEY);
+		return id instanceof Integer ? ((Integer) id).intValue() : -1;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getSemanticCommand(IEditCommandRequest request) {
+		IEditCommandRequest completedRequest = completeRequest(request);
+		Command semanticCommand = getSemanticCommandSwitch(completedRequest);
+		semanticCommand = getEditHelperCommand(completedRequest, semanticCommand);
+		if (completedRequest instanceof DestroyRequest) {
+			DestroyRequest destroyRequest = (DestroyRequest) completedRequest;
+			return shouldProceed(destroyRequest) ? addDeleteViewCommand(semanticCommand, destroyRequest) : null;
+		}
+		return semanticCommand;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command addDeleteViewCommand(Command mainCommand, DestroyRequest completedRequest) {
+		Command deleteViewCommand = getGEFWrapper(new DeleteCommand(getEditingDomain(), (View) getHost().getModel()));
+		return mainCommand == null ? deleteViewCommand : mainCommand.chain(deleteViewCommand);
+	}
+
+	/**
+	 * @generated
+	 */
+	private Command getEditHelperCommand(IEditCommandRequest request, Command editPolicyCommand) {
+		if (editPolicyCommand != null) {
+			ICommand command = editPolicyCommand instanceof ICommandProxy ? ((ICommandProxy) editPolicyCommand).getICommand() : new CommandProxy(editPolicyCommand);
+			request.setParameter(GeneratedEditHelperBase.EDIT_POLICY_COMMAND, command);
+		}
+		IElementType requestContextElementType = getContextElementType(request);
+		request.setParameter(GeneratedEditHelperBase.CONTEXT_ELEMENT_TYPE, requestContextElementType);
+		ICommand command = requestContextElementType.getEditCommand(request);
+		request.setParameter(GeneratedEditHelperBase.EDIT_POLICY_COMMAND, null);
+		request.setParameter(GeneratedEditHelperBase.CONTEXT_ELEMENT_TYPE, null);
+		if (command != null) {
+			if (!(command instanceof CompositeTransactionalCommand)) {
+				command = new CompositeTransactionalCommand(getEditingDomain(), command.getLabel()).compose(command);
+			}
+			return new ICommandProxy(command);
+		}
+		return editPolicyCommand;
+	}
+
+	/**
+	 * @generated
+	 */
+	private IElementType getContextElementType(IEditCommandRequest request) {
+		IElementType requestContextElementType = LinklfElementTypes.getElementType(getVisualID(request));
+		return requestContextElementType != null ? requestContextElementType : myElementType;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getSemanticCommandSwitch(IEditCommandRequest req) {
+		if (req instanceof CreateRelationshipRequest) {
+			return getCreateRelationshipCommand((CreateRelationshipRequest) req);
+		} else if (req instanceof CreateElementRequest) {
+			return getCreateCommand((CreateElementRequest) req);
+		} else if (req instanceof ConfigureRequest) {
+			return getConfigureCommand((ConfigureRequest) req);
+		} else if (req instanceof DestroyElementRequest) {
+			return getDestroyElementCommand((DestroyElementRequest) req);
+		} else if (req instanceof DestroyReferenceRequest) {
+			return getDestroyReferenceCommand((DestroyReferenceRequest) req);
+		} else if (req instanceof DuplicateElementsRequest) {
+			return getDuplicateCommand((DuplicateElementsRequest) req);
+		} else if (req instanceof GetEditContextRequest) {
+			return getEditContextCommand((GetEditContextRequest) req);
+		} else if (req instanceof MoveRequest) {
+			return getMoveCommand((MoveRequest) req);
+		} else if (req instanceof ReorientReferenceRelationshipRequest) {
+			return getReorientReferenceRelationshipCommand((ReorientReferenceRelationshipRequest) req);
+		} else if (req instanceof ReorientRelationshipRequest) {
+			return getReorientRelationshipCommand((ReorientRelationshipRequest) req);
+		} else if (req instanceof SetRequest) {
+			return getSetCommand((SetRequest) req);
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getConfigureCommand(ConfigureRequest req) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateCommand(CreateElementRequest req) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getSetCommand(SetRequest req) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getEditContextCommand(GetEditContextRequest req) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyReferenceCommand(DestroyReferenceRequest req) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDuplicateCommand(DuplicateElementsRequest req) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getMoveCommand(MoveRequest req) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getReorientReferenceRelationshipCommand(ReorientReferenceRelationshipRequest req) {
+		return UnexecutableCommand.INSTANCE;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getReorientRelationshipCommand(ReorientRelationshipRequest req) {
+		return UnexecutableCommand.INSTANCE;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected final Command getGEFWrapper(ICommand cmd) {
+		return new ICommandProxy(cmd);
+	}
+
+	/**
+	 * Returns editing domain from the host edit part.
+	 * @generated
+	 */
+	protected TransactionalEditingDomain getEditingDomain() {
+		return ((IGraphicalEditPart) getHost()).getEditingDomain();
+	}
+
+	/**
+	 * Clean all shortcuts to the host element from the same diagram
+	 * @generated
+	 */
+	protected void addDestroyShortcutsCommand(ICompositeCommand cmd, View view) {
+		assert view.getEAnnotation("Shortcut") == null; //$NON-NLS-1$
+		for (Iterator it = view.getDiagram().getChildren().iterator(); it.hasNext();) {
+			View nextView = (View) it.next();
+			if (nextView.getEAnnotation("Shortcut") == null || !nextView.isSetElement() || nextView.getElement() != view.getElement()) { //$NON-NLS-1$
+				continue;
+			}
+			cmd.add(new DeleteCommand(getEditingDomain(), nextView));
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public static LinkConstraints getLinkConstraints() {
+		LinkConstraints cached = LinklfDiagramEditorPlugin.getInstance().getLinkConstraints();
+		if (cached == null) {
+			LinklfDiagramEditorPlugin.getInstance().setLinkConstraints(cached = new LinkConstraints());
+		}
+		return cached;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static class LinkConstraints {
+
+		/**
+		 * @generated
+		 */
+		LinkConstraints() {
+			// use static method #getLinkConstraints() to access instance
+		}
+
+		/**
+		 * @generated
+		 */
+		public boolean canCreateLink_4001(CanvasElementContainer container, Node source, Node target) {
+			return canExistLink_4001(container, null, source, target);
+		}
+
+		/**
+		 * @generated
+		 */
+		public boolean canCreateLabeledLink_4002(CanvasElementContainer container, Node source, Node target) {
+			return canExistLabeledLink_4002(container, null, source, target);
+		}
+
+		/**
+		 * @generated
+		 */
+		public boolean canExistLink_4001(CanvasElementContainer container, Link linkInstance, Node source, Node target) {
+			return true;
+		}
+
+		/**
+		 * @generated
+		 */
+		public boolean canExistLabeledLink_4002(CanvasElementContainer container, LabeledLink linkInstance, Node source, Node target) {
+			return true;
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinklfTextNonResizableEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinklfTextNonResizableEditPolicy.java
new file mode 100644
index 0000000..989a4d2
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinklfTextNonResizableEditPolicy.java
@@ -0,0 +1,226 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.FigureListener;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.handles.MoveHandle;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.NonResizableEditPolicyEx;
+import org.eclipse.gmf.runtime.diagram.ui.tools.DragEditPartsTrackerEx;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;
+
+/**
+ * @generated
+ */
+public class LinklfTextNonResizableEditPolicy extends NonResizableEditPolicyEx implements IRefreshableFeedbackEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	private IFigure selectionFeedbackFigure;
+
+	/**
+	 * @generated
+	 */
+	private IFigure focusFeedbackFigure;
+
+	/**
+	 * @generated
+	 */
+	private FigureListener hostPositionListener;
+
+	/**
+	 * @generated
+	 */
+	protected void showPrimarySelection() {
+		if (getHostFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getHostFigure()).setSelected(true);
+			((WrappingLabel) getHostFigure()).setFocus(true);
+		} else {
+			showSelection();
+			showFocus();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void showSelection() {
+		if (getHostFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getHostFigure()).setSelected(true);
+			((WrappingLabel) getHostFigure()).setFocus(false);
+		} else {
+			hideSelection();
+			addFeedback(selectionFeedbackFigure = createSelectionFeedbackFigure());
+			getHostFigure().addFigureListener(getHostPositionListener());
+			refreshSelectionFeedback();
+			hideFocus();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void hideSelection() {
+		if (getHostFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getHostFigure()).setSelected(false);
+			((WrappingLabel) getHostFigure()).setFocus(false);
+		} else {
+			if (selectionFeedbackFigure != null) {
+				removeFeedback(selectionFeedbackFigure);
+				getHostFigure().removeFigureListener(getHostPositionListener());
+				selectionFeedbackFigure = null;
+			}
+			hideFocus();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void showFocus() {
+		if (getHostFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getHostFigure()).setFocus(true);
+		} else {
+			hideFocus();
+			addFeedback(focusFeedbackFigure = createFocusFeedbackFigure());
+			refreshFocusFeedback();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void hideFocus() {
+		if (getHostFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getHostFigure()).setFocus(false);
+		} else {
+			if (focusFeedbackFigure != null) {
+				removeFeedback(focusFeedbackFigure);
+				focusFeedbackFigure = null;
+			}
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Rectangle getFeedbackBounds() {
+		Rectangle bounds;
+		if (getHostFigure() instanceof Label) {
+			bounds = ((Label) getHostFigure()).getTextBounds();
+			bounds.intersect(getHostFigure().getBounds());
+		} else {
+			bounds = getHostFigure().getBounds().getCopy();
+		}
+		getHostFigure().getParent().translateToAbsolute(bounds);
+		getFeedbackLayer().translateToRelative(bounds);
+		return bounds;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createSelectionFeedbackFigure() {
+		if (getHostFigure() instanceof Label) {
+			Label feedbackFigure = new Label();
+			feedbackFigure.setOpaque(true);
+			feedbackFigure.setBackgroundColor(ColorConstants.menuBackgroundSelected);
+			feedbackFigure.setForegroundColor(ColorConstants.menuForegroundSelected);
+			return feedbackFigure;
+		} else {
+			RectangleFigure feedbackFigure = new RectangleFigure();
+			feedbackFigure.setFill(false);
+			return feedbackFigure;
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createFocusFeedbackFigure() {
+		return new Figure() {
+
+			protected void paintFigure(Graphics graphics) {
+				graphics.drawFocus(getBounds().getResized(-1, -1));
+			}
+		};
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void updateLabel(Label target) {
+		Label source = (Label) getHostFigure();
+		target.setText(source.getText());
+		target.setTextAlignment(source.getTextAlignment());
+		target.setFont(source.getFont());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshSelectionFeedback() {
+		if (selectionFeedbackFigure != null) {
+			if (selectionFeedbackFigure instanceof Label) {
+				updateLabel((Label) selectionFeedbackFigure);
+				selectionFeedbackFigure.setBounds(getFeedbackBounds());
+			} else {
+				selectionFeedbackFigure.setBounds(getFeedbackBounds().expand(5, 5));
+			}
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshFocusFeedback() {
+		if (focusFeedbackFigure != null) {
+			focusFeedbackFigure.setBounds(getFeedbackBounds());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public void refreshFeedback() {
+		refreshSelectionFeedback();
+		refreshFocusFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	private FigureListener getHostPositionListener() {
+		if (hostPositionListener == null) {
+			hostPositionListener = new FigureListener() {
+
+				public void figureMoved(IFigure source) {
+					refreshFeedback();
+				}
+			};
+		}
+		return hostPositionListener;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected List createSelectionHandles() {
+		MoveHandle moveHandle = new MoveHandle((GraphicalEditPart) getHost());
+		moveHandle.setBorder(null);
+		moveHandle.setDragTracker(new DragEditPartsTrackerEx(getHost()));
+		return Collections.singletonList(moveHandle);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinklfTextSelectionEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinklfTextSelectionEditPolicy.java
new file mode 100644
index 0000000..39575e1
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/LinklfTextSelectionEditPolicy.java
@@ -0,0 +1,210 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.FigureListener;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.editpolicies.SelectionEditPolicy;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;
+
+/**
+ * @generated
+ */
+public class LinklfTextSelectionEditPolicy extends SelectionEditPolicy implements IRefreshableFeedbackEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	private IFigure selectionFeedbackFigure;
+
+	/**
+	 * @generated
+	 */
+	private IFigure focusFeedbackFigure;
+
+	/**
+	 * @generated
+	 */
+	private FigureListener hostPositionListener;
+
+	/**
+	 * @generated
+	 */
+	protected void showPrimarySelection() {
+		if (getHostFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getHostFigure()).setSelected(true);
+			((WrappingLabel) getHostFigure()).setFocus(true);
+		} else {
+			showSelection();
+			showFocus();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void showSelection() {
+		if (getHostFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getHostFigure()).setSelected(true);
+			((WrappingLabel) getHostFigure()).setFocus(false);
+		} else {
+			hideSelection();
+			addFeedback(selectionFeedbackFigure = createSelectionFeedbackFigure());
+			getHostFigure().addFigureListener(getHostPositionListener());
+			refreshSelectionFeedback();
+			hideFocus();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void hideSelection() {
+		if (getHostFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getHostFigure()).setSelected(false);
+			((WrappingLabel) getHostFigure()).setFocus(false);
+		} else {
+			if (selectionFeedbackFigure != null) {
+				removeFeedback(selectionFeedbackFigure);
+				getHostFigure().removeFigureListener(getHostPositionListener());
+				selectionFeedbackFigure = null;
+			}
+			hideFocus();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void showFocus() {
+		if (getHostFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getHostFigure()).setFocus(true);
+		} else {
+			hideFocus();
+			addFeedback(focusFeedbackFigure = createFocusFeedbackFigure());
+			refreshFocusFeedback();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void hideFocus() {
+		if (getHostFigure() instanceof WrappingLabel) {
+			((WrappingLabel) getHostFigure()).setFocus(false);
+		} else {
+			if (focusFeedbackFigure != null) {
+				removeFeedback(focusFeedbackFigure);
+				focusFeedbackFigure = null;
+			}
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Rectangle getFeedbackBounds() {
+		Rectangle bounds;
+		if (getHostFigure() instanceof Label) {
+			bounds = ((Label) getHostFigure()).getTextBounds();
+			bounds.intersect(getHostFigure().getBounds());
+		} else {
+			bounds = getHostFigure().getBounds().getCopy();
+		}
+		getHostFigure().getParent().translateToAbsolute(bounds);
+		getFeedbackLayer().translateToRelative(bounds);
+		return bounds;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createSelectionFeedbackFigure() {
+		if (getHostFigure() instanceof Label) {
+			Label feedbackFigure = new Label();
+			feedbackFigure.setOpaque(true);
+			feedbackFigure.setBackgroundColor(ColorConstants.menuBackgroundSelected);
+			feedbackFigure.setForegroundColor(ColorConstants.menuForegroundSelected);
+			return feedbackFigure;
+		} else {
+			RectangleFigure feedbackFigure = new RectangleFigure();
+			feedbackFigure.setFill(false);
+			return feedbackFigure;
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IFigure createFocusFeedbackFigure() {
+		return new Figure() {
+
+			protected void paintFigure(Graphics graphics) {
+				graphics.drawFocus(getBounds().getResized(-1, -1));
+			}
+		};
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void updateLabel(Label target) {
+		Label source = (Label) getHostFigure();
+		target.setText(source.getText());
+		target.setTextAlignment(source.getTextAlignment());
+		target.setFont(source.getFont());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshSelectionFeedback() {
+		if (selectionFeedbackFigure != null) {
+			if (selectionFeedbackFigure instanceof Label) {
+				updateLabel((Label) selectionFeedbackFigure);
+				selectionFeedbackFigure.setBounds(getFeedbackBounds());
+			} else {
+				selectionFeedbackFigure.setBounds(getFeedbackBounds().expand(5, 5));
+			}
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void refreshFocusFeedback() {
+		if (focusFeedbackFigure != null) {
+			focusFeedbackFigure.setBounds(getFeedbackBounds());
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public void refreshFeedback() {
+		refreshSelectionFeedback();
+		refreshFocusFeedback();
+	}
+
+	/**
+	 * @generated
+	 */
+	private FigureListener getHostPositionListener() {
+		if (hostPositionListener == null) {
+			hostPositionListener = new FigureListener() {
+
+				public void figureMoved(IFigure source) {
+					refreshFeedback();
+				}
+			};
+		}
+		return hostPositionListener;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/PortItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/PortItemSemanticEditPolicy.java
new file mode 100644
index 0000000..81e332b
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/PortItemSemanticEditPolicy.java
@@ -0,0 +1,135 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class PortItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public PortItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Port_3005);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		View view = (View) getHost().getModel();
+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(getEditingDomain(), null);
+		cmd.setTransactionNestingEnabled(false);
+		for (Iterator<?> it = view.getTargetEdges().iterator(); it.hasNext();) {
+			Edge incomingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+		}
+		for (Iterator<?> it = view.getSourceEdges().iterator(); it.hasNext();) {
+			Edge outgoingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+		}
+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
+		if (annotation == null) {
+			// there are indirectly referenced children, need extra commands: false
+			addDestroyShortcutsCommand(cmd, view);
+			// delete host element
+			cmd.add(new DestroyElementCommand(req));
+		} else {
+			cmd.add(new DeleteCommand(getEditingDomain(), view));
+		}
+		return getGEFWrapper(cmd.reduce());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
+		Command command = req.getTarget() == null ? getStartCreateRelationshipCommand(req) : getCompleteCreateRelationshipCommand(req);
+		return command != null ? command : super.getCreateRelationshipCommand(req);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getStartCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCompleteCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * Returns command to reorient EClass based link. New link target or source
+	 * should be the domain model element associated with this node.
+	 * 
+	 * @generated
+	 */
+	protected Command getReorientRelationshipCommand(ReorientRelationshipRequest req) {
+		switch (getVisualID(req)) {
+		case LinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LinkReorientCommand(req));
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LabeledLinkReorientCommand(req));
+		}
+		return super.getReorientRelationshipCommand(req);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Rectangle2ItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Rectangle2ItemSemanticEditPolicy.java
new file mode 100644
index 0000000..d1f608d
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Rectangle2ItemSemanticEditPolicy.java
@@ -0,0 +1,135 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class Rectangle2ItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public Rectangle2ItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Rectangle_3003);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		View view = (View) getHost().getModel();
+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(getEditingDomain(), null);
+		cmd.setTransactionNestingEnabled(false);
+		for (Iterator<?> it = view.getTargetEdges().iterator(); it.hasNext();) {
+			Edge incomingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+		}
+		for (Iterator<?> it = view.getSourceEdges().iterator(); it.hasNext();) {
+			Edge outgoingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+		}
+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
+		if (annotation == null) {
+			// there are indirectly referenced children, need extra commands: false
+			addDestroyShortcutsCommand(cmd, view);
+			// delete host element
+			cmd.add(new DestroyElementCommand(req));
+		} else {
+			cmd.add(new DeleteCommand(getEditingDomain(), view));
+		}
+		return getGEFWrapper(cmd.reduce());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
+		Command command = req.getTarget() == null ? getStartCreateRelationshipCommand(req) : getCompleteCreateRelationshipCommand(req);
+		return command != null ? command : super.getCreateRelationshipCommand(req);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getStartCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCompleteCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * Returns command to reorient EClass based link. New link target or source
+	 * should be the domain model element associated with this node.
+	 * 
+	 * @generated
+	 */
+	protected Command getReorientRelationshipCommand(ReorientRelationshipRequest req) {
+		switch (getVisualID(req)) {
+		case LinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LinkReorientCommand(req));
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LabeledLinkReorientCommand(req));
+		}
+		return super.getReorientRelationshipCommand(req);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/RectangleItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/RectangleItemSemanticEditPolicy.java
new file mode 100644
index 0000000..4330c49
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/RectangleItemSemanticEditPolicy.java
@@ -0,0 +1,135 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class RectangleItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public RectangleItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Rectangle_2002);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		View view = (View) getHost().getModel();
+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(getEditingDomain(), null);
+		cmd.setTransactionNestingEnabled(false);
+		for (Iterator<?> it = view.getTargetEdges().iterator(); it.hasNext();) {
+			Edge incomingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+		}
+		for (Iterator<?> it = view.getSourceEdges().iterator(); it.hasNext();) {
+			Edge outgoingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+		}
+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
+		if (annotation == null) {
+			// there are indirectly referenced children, need extra commands: false
+			addDestroyShortcutsCommand(cmd, view);
+			// delete host element
+			cmd.add(new DestroyElementCommand(req));
+		} else {
+			cmd.add(new DeleteCommand(getEditingDomain(), view));
+		}
+		return getGEFWrapper(cmd.reduce());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
+		Command command = req.getTarget() == null ? getStartCreateRelationshipCommand(req) : getCompleteCreateRelationshipCommand(req);
+		return command != null ? command : super.getCreateRelationshipCommand(req);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getStartCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCompleteCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * Returns command to reorient EClass based link. New link target or source
+	 * should be the domain model element associated with this node.
+	 * 
+	 * @generated
+	 */
+	protected Command getReorientRelationshipCommand(ReorientRelationshipRequest req) {
+		switch (getVisualID(req)) {
+		case LinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LinkReorientCommand(req));
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LabeledLinkReorientCommand(req));
+		}
+		return super.getReorientRelationshipCommand(req);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Rhombus2ItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Rhombus2ItemSemanticEditPolicy.java
new file mode 100644
index 0000000..8d24088
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/Rhombus2ItemSemanticEditPolicy.java
@@ -0,0 +1,135 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class Rhombus2ItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public Rhombus2ItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Rhombus_3004);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		View view = (View) getHost().getModel();
+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(getEditingDomain(), null);
+		cmd.setTransactionNestingEnabled(false);
+		for (Iterator<?> it = view.getTargetEdges().iterator(); it.hasNext();) {
+			Edge incomingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+		}
+		for (Iterator<?> it = view.getSourceEdges().iterator(); it.hasNext();) {
+			Edge outgoingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+		}
+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
+		if (annotation == null) {
+			// there are indirectly referenced children, need extra commands: false
+			addDestroyShortcutsCommand(cmd, view);
+			// delete host element
+			cmd.add(new DestroyElementCommand(req));
+		} else {
+			cmd.add(new DeleteCommand(getEditingDomain(), view));
+		}
+		return getGEFWrapper(cmd.reduce());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
+		Command command = req.getTarget() == null ? getStartCreateRelationshipCommand(req) : getCompleteCreateRelationshipCommand(req);
+		return command != null ? command : super.getCreateRelationshipCommand(req);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getStartCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCompleteCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * Returns command to reorient EClass based link. New link target or source
+	 * should be the domain model element associated with this node.
+	 * 
+	 * @generated
+	 */
+	protected Command getReorientRelationshipCommand(ReorientRelationshipRequest req) {
+		switch (getVisualID(req)) {
+		case LinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LinkReorientCommand(req));
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LabeledLinkReorientCommand(req));
+		}
+		return super.getReorientRelationshipCommand(req);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/RhombusItemSemanticEditPolicy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/RhombusItemSemanticEditPolicy.java
new file mode 100644
index 0000000..7b40e99
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/edit/policies/RhombusItemSemanticEditPolicy.java
@@ -0,0 +1,135 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LabeledLinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkCreateCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.commands.LinkReorientCommand;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+
+/**
+ * @generated
+ */
+public class RhombusItemSemanticEditPolicy extends LinklfBaseItemSemanticEditPolicy {
+
+	/**
+	 * @generated
+	 */
+	public RhombusItemSemanticEditPolicy() {
+		super(LinklfElementTypes.Rhombus_2004);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getDestroyElementCommand(DestroyElementRequest req) {
+		View view = (View) getHost().getModel();
+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(getEditingDomain(), null);
+		cmd.setTransactionNestingEnabled(false);
+		for (Iterator<?> it = view.getTargetEdges().iterator(); it.hasNext();) {
+			Edge incomingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(incomingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(incomingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));
+				continue;
+			}
+		}
+		for (Iterator<?> it = view.getSourceEdges().iterator(); it.hasNext();) {
+			Edge outgoingLink = (Edge) it.next();
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+			if (LinklfVisualIDRegistry.getVisualID(outgoingLink) == LabeledLinkEditPart.VISUAL_ID) {
+				DestroyElementRequest r = new DestroyElementRequest(outgoingLink.getElement(), false);
+				cmd.add(new DestroyElementCommand(r));
+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));
+				continue;
+			}
+		}
+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
+		if (annotation == null) {
+			// there are indirectly referenced children, need extra commands: false
+			addDestroyShortcutsCommand(cmd, view);
+			// delete host element
+			cmd.add(new DestroyElementCommand(req));
+		} else {
+			cmd.add(new DeleteCommand(getEditingDomain(), view));
+		}
+		return getGEFWrapper(cmd.reduce());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
+		Command command = req.getTarget() == null ? getStartCreateRelationshipCommand(req) : getCompleteCreateRelationshipCommand(req);
+		return command != null ? command : super.getCreateRelationshipCommand(req);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getStartCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected Command getCompleteCreateRelationshipCommand(CreateRelationshipRequest req) {
+		if (LinklfElementTypes.Link_4001 == req.getElementType()) {
+			return getGEFWrapper(new LinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		if (LinklfElementTypes.LabeledLink_4002 == req.getElementType()) {
+			return getGEFWrapper(new LabeledLinkCreateCommand(req, req.getSource(), req.getTarget()));
+		}
+		return null;
+	}
+
+	/**
+	 * Returns command to reorient EClass based link. New link target or source
+	 * should be the domain model element associated with this node.
+	 * 
+	 * @generated
+	 */
+	protected Command getReorientRelationshipCommand(ReorientRelationshipRequest req) {
+		switch (getVisualID(req)) {
+		case LinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LinkReorientCommand(req));
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getGEFWrapper(new LabeledLinkReorientCommand(req));
+		}
+		return super.getReorientRelationshipCommand(req);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfAbstractNavigatorItem.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfAbstractNavigatorItem.java
new file mode 100644
index 0000000..a2bd61f
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfAbstractNavigatorItem.java
@@ -0,0 +1,58 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
+
+/**
+ * @generated
+ */
+public abstract class LinklfAbstractNavigatorItem extends PlatformObject {
+
+	/**
+	 * @generated
+	 */
+	static {
+		final Class[] supportedTypes = new Class[] { ITabbedPropertySheetPageContributor.class };
+		final ITabbedPropertySheetPageContributor propertySheetPageContributor = new ITabbedPropertySheetPageContributor() {
+
+			public String getContributorId() {
+				return "org.eclipse.gmf.tooling.examples.linklf.diagram"; //$NON-NLS-1$
+			}
+		};
+		Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {
+
+			public Object getAdapter(Object adaptableObject, Class adapterType) {
+				if (adaptableObject instanceof org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfAbstractNavigatorItem && adapterType == ITabbedPropertySheetPageContributor.class) {
+					return propertySheetPageContributor;
+				}
+				return null;
+			}
+
+			public Class[] getAdapterList() {
+				return supportedTypes;
+			}
+		}, org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfAbstractNavigatorItem.class);
+	}
+
+	/**
+	 * @generated
+	 */
+	private Object myParent;
+
+	/**
+	 * @generated
+	 */
+	protected LinklfAbstractNavigatorItem(Object parent) {
+		myParent = parent;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object getParent() {
+		return myParent;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfDomainNavigatorContentProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfDomainNavigatorContentProvider.java
new file mode 100644
index 0000000..4d7e932
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfDomainNavigatorContentProvider.java
@@ -0,0 +1,217 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.navigator.ICommonContentExtensionSite;
+import org.eclipse.ui.navigator.ICommonContentProvider;
+
+/**
+ * @generated
+ */
+public class LinklfDomainNavigatorContentProvider implements ICommonContentProvider {
+
+	/**
+	 * @generated
+	 */
+	private AdapterFactoryContentProvider myAdapterFctoryContentProvier;
+
+	/**
+	 * @generated
+	 */
+	private static final Object[] EMPTY_ARRAY = new Object[0];
+
+	/**
+	 * @generated
+	 */
+	private Viewer myViewer;
+
+	/**
+	 * @generated
+	 */
+	private AdapterFactoryEditingDomain myEditingDomain;
+
+	/**
+	 * @generated
+	 */
+	private WorkspaceSynchronizer myWorkspaceSynchronizer;
+
+	/**
+	 * @generated
+	 */
+	private Runnable myViewerRefreshRunnable;
+
+	/**
+	 * @generated
+	 */
+	public LinklfDomainNavigatorContentProvider() {
+		myAdapterFctoryContentProvier = new AdapterFactoryContentProvider(LinklfDiagramEditorPlugin.getInstance().getItemProvidersAdapterFactory());
+		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE.createEditingDomain();
+		myEditingDomain = (AdapterFactoryEditingDomain) editingDomain;
+		myEditingDomain.setResourceToReadOnlyMap(new HashMap() {
+
+			public Object get(Object key) {
+				if (!containsKey(key)) {
+					put(key, Boolean.TRUE);
+				}
+				return super.get(key);
+			}
+		});
+		myViewerRefreshRunnable = new Runnable() {
+
+			public void run() {
+				if (myViewer != null) {
+					myViewer.refresh();
+				}
+			}
+		};
+		myWorkspaceSynchronizer = new WorkspaceSynchronizer(editingDomain, new WorkspaceSynchronizer.Delegate() {
+
+			public void dispose() {
+			}
+
+			public boolean handleResourceChanged(final Resource resource) {
+				unloadAllResources();
+				asyncRefresh();
+				return true;
+			}
+
+			public boolean handleResourceDeleted(Resource resource) {
+				unloadAllResources();
+				asyncRefresh();
+				return true;
+			}
+
+			public boolean handleResourceMoved(Resource resource, final URI newURI) {
+				unloadAllResources();
+				asyncRefresh();
+				return true;
+			}
+		});
+	}
+
+	/**
+	 * @generated
+	 */
+	public void dispose() {
+		myWorkspaceSynchronizer.dispose();
+		myWorkspaceSynchronizer = null;
+		myViewerRefreshRunnable = null;
+		myViewer = null;
+		unloadAllResources();
+		((TransactionalEditingDomain) myEditingDomain).dispose();
+		myEditingDomain = null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		myViewer = viewer;
+	}
+
+	/**
+	 * @generated
+	 */
+	void unloadAllResources() {
+		for (Resource nextResource : myEditingDomain.getResourceSet().getResources()) {
+			nextResource.unload();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	void asyncRefresh() {
+		if (myViewer != null && !myViewer.getControl().isDisposed()) {
+			myViewer.getControl().getDisplay().asyncExec(myViewerRefreshRunnable);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object[] getElements(Object inputElement) {
+		return getChildren(inputElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void restoreState(IMemento aMemento) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public void saveState(IMemento aMemento) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public void init(ICommonContentExtensionSite aConfig) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object[] getChildren(Object parentElement) {
+		if (parentElement instanceof IFile) {
+			IFile file = (IFile) parentElement;
+			URI fileURI = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
+			Resource resource = myEditingDomain.getResourceSet().getResource(fileURI, true);
+			return wrapEObjects(myAdapterFctoryContentProvier.getChildren(resource), parentElement);
+		}
+
+		if (parentElement instanceof LinklfDomainNavigatorItem) {
+			return wrapEObjects(myAdapterFctoryContentProvier.getChildren(((LinklfDomainNavigatorItem) parentElement).getEObject()), parentElement);
+		}
+		return EMPTY_ARRAY;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object[] wrapEObjects(Object[] objects, Object parentElement) {
+		Collection result = new ArrayList();
+		for (int i = 0; i < objects.length; i++) {
+			if (objects[i] instanceof EObject) {
+				result.add(new LinklfDomainNavigatorItem((EObject) objects[i], parentElement, myAdapterFctoryContentProvier));
+			}
+		}
+		return result.toArray();
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object getParent(Object element) {
+		if (element instanceof LinklfAbstractNavigatorItem) {
+			LinklfAbstractNavigatorItem abstractNavigatorItem = (LinklfAbstractNavigatorItem) element;
+			return abstractNavigatorItem.getParent();
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean hasChildren(Object element) {
+		return element instanceof IFile || getChildren(element).length > 0;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfDomainNavigatorItem.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfDomainNavigatorItem.java
new file mode 100644
index 0000000..0ca1597
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfDomainNavigatorItem.java
@@ -0,0 +1,106 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.IPropertySourceProvider;
+
+/**
+ * @generated
+ */
+public class LinklfDomainNavigatorItem extends PlatformObject {
+
+	/**
+	 * @generated
+	 */
+	static {
+		final Class[] supportedTypes = new Class[] { EObject.class, IPropertySource.class };
+		Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {
+
+			public Object getAdapter(Object adaptableObject, Class adapterType) {
+				if (adaptableObject instanceof org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfDomainNavigatorItem) {
+					org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfDomainNavigatorItem domainNavigatorItem = (org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfDomainNavigatorItem) adaptableObject;
+					EObject eObject = domainNavigatorItem.getEObject();
+					if (adapterType == EObject.class) {
+						return eObject;
+					}
+					if (adapterType == IPropertySource.class) {
+						return domainNavigatorItem.getPropertySourceProvider().getPropertySource(eObject);
+					}
+				}
+
+				return null;
+			}
+
+			public Class[] getAdapterList() {
+				return supportedTypes;
+			}
+		}, org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfDomainNavigatorItem.class);
+	}
+
+	/**
+	 * @generated
+	 */
+	private Object myParent;
+
+	/**
+	 * @generated
+	 */
+	private EObject myEObject;
+
+	/**
+	 * @generated
+	 */
+	private IPropertySourceProvider myPropertySourceProvider;
+
+	/**
+	 * @generated
+	 */
+	public LinklfDomainNavigatorItem(EObject eObject, Object parent, IPropertySourceProvider propertySourceProvider) {
+		myParent = parent;
+		myEObject = eObject;
+		myPropertySourceProvider = propertySourceProvider;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object getParent() {
+		return myParent;
+	}
+
+	/**
+	 * @generated
+	 */
+	public EObject getEObject() {
+		return myEObject;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IPropertySourceProvider getPropertySourceProvider() {
+		return myPropertySourceProvider;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean equals(Object obj) {
+		if (obj instanceof org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfDomainNavigatorItem) {
+			return EcoreUtil.getURI(getEObject()).equals(EcoreUtil.getURI(((org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfDomainNavigatorItem) obj).getEObject()));
+		}
+		return super.equals(obj);
+	}
+
+	/**
+	 * @generated
+	 */
+	public int hashCode() {
+		return EcoreUtil.getURI(getEObject()).hashCode();
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfDomainNavigatorLabelProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfDomainNavigatorLabelProvider.java
new file mode 100644
index 0000000..00476b0
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfDomainNavigatorLabelProvider.java
@@ -0,0 +1,94 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.navigator.ICommonContentExtensionSite;
+import org.eclipse.ui.navigator.ICommonLabelProvider;
+
+/**
+ * @generated
+ */
+public class LinklfDomainNavigatorLabelProvider implements ICommonLabelProvider {
+
+	/**
+	 * @generated
+	 */
+	private AdapterFactoryLabelProvider myAdapterFactoryLabelProvider = new AdapterFactoryLabelProvider(LinklfDiagramEditorPlugin.getInstance().getItemProvidersAdapterFactory());
+
+	/**
+	 * @generated
+	 */
+	public void init(ICommonContentExtensionSite aConfig) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public Image getImage(Object element) {
+		if (element instanceof LinklfDomainNavigatorItem) {
+			return myAdapterFactoryLabelProvider.getImage(((LinklfDomainNavigatorItem) element).getEObject());
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getText(Object element) {
+		if (element instanceof LinklfDomainNavigatorItem) {
+			return myAdapterFactoryLabelProvider.getText(((LinklfDomainNavigatorItem) element).getEObject());
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void addListener(ILabelProviderListener listener) {
+		myAdapterFactoryLabelProvider.addListener(listener);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void dispose() {
+		myAdapterFactoryLabelProvider.dispose();
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean isLabelProperty(Object element, String property) {
+		return myAdapterFactoryLabelProvider.isLabelProperty(element, property);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void removeListener(ILabelProviderListener listener) {
+		myAdapterFactoryLabelProvider.removeListener(listener);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void restoreState(IMemento aMemento) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public void saveState(IMemento aMemento) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getDescription(Object anElement) {
+		return null;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorActionProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorActionProvider.java
new file mode 100644
index 0000000..e9dd6be
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorActionProvider.java
@@ -0,0 +1,168 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.common.ui.URIEditorInput;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditor;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.Messages;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.navigator.CommonActionProvider;
+import org.eclipse.ui.navigator.ICommonActionConstants;
+import org.eclipse.ui.navigator.ICommonActionExtensionSite;
+import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * @generated
+ */
+public class LinklfNavigatorActionProvider extends CommonActionProvider {
+
+	/**
+	 * @generated
+	 */
+	private boolean myContribute;
+
+	/**
+	 * @generated
+	 */
+	private OpenDiagramAction myOpenDiagramAction;
+
+	/**
+	 * @generated
+	 */
+	public void init(ICommonActionExtensionSite aSite) {
+		super.init(aSite);
+		if (aSite.getViewSite() instanceof ICommonViewerWorkbenchSite) {
+			myContribute = true;
+			makeActions((ICommonViewerWorkbenchSite) aSite.getViewSite());
+		} else {
+			myContribute = false;
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private void makeActions(ICommonViewerWorkbenchSite viewerSite) {
+		myOpenDiagramAction = new OpenDiagramAction(viewerSite);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void fillActionBars(IActionBars actionBars) {
+		if (!myContribute) {
+			return;
+		}
+		IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
+		myOpenDiagramAction.selectionChanged(selection);
+		if (myOpenDiagramAction.isEnabled()) {
+			actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, myOpenDiagramAction);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public void fillContextMenu(IMenuManager menu) {
+	}
+
+	/**
+	 * @generated
+	 */
+	private static class OpenDiagramAction extends Action {
+
+		/**
+		 * @generated
+		 */
+		private Diagram myDiagram;
+
+		/**
+		 * @generated
+		 */
+		private ICommonViewerWorkbenchSite myViewerSite;
+
+		/**
+		 * @generated
+		 */
+		public OpenDiagramAction(ICommonViewerWorkbenchSite viewerSite) {
+			super(Messages.NavigatorActionProvider_OpenDiagramActionName);
+			myViewerSite = viewerSite;
+		}
+
+		/**
+		 * @generated
+		 */
+		public final void selectionChanged(IStructuredSelection selection) {
+			myDiagram = null;
+			if (selection.size() == 1) {
+				Object selectedElement = selection.getFirstElement();
+				if (selectedElement instanceof LinklfNavigatorItem) {
+					selectedElement = ((LinklfNavigatorItem) selectedElement).getView();
+				} else if (selectedElement instanceof IAdaptable) {
+					selectedElement = ((IAdaptable) selectedElement).getAdapter(View.class);
+				}
+				if (selectedElement instanceof Diagram) {
+					Diagram diagram = (Diagram) selectedElement;
+					if (CanvasEditPart.MODEL_ID.equals(LinklfVisualIDRegistry.getModelID(diagram))) {
+						myDiagram = diagram;
+					}
+				}
+			}
+			setEnabled(myDiagram != null);
+		}
+
+		/**
+		 * @generated
+		 */
+		public void run() {
+			if (myDiagram == null || myDiagram.eResource() == null) {
+				return;
+			}
+
+			IEditorInput editorInput = getEditorInput(myDiagram);
+			IWorkbenchPage page = myViewerSite.getPage();
+			try {
+				page.openEditor(editorInput, LinklfDiagramEditor.ID);
+			} catch (PartInitException e) {
+				LinklfDiagramEditorPlugin.getInstance().logError("Exception while openning diagram", e); //$NON-NLS-1$
+			}
+		}
+
+		/**
+		 * @generated
+		 */
+		private static IEditorInput getEditorInput(Diagram diagram) {
+			Resource diagramResource = diagram.eResource();
+			for (EObject nextEObject : diagramResource.getContents()) {
+				if (nextEObject == diagram) {
+					return new FileEditorInput(WorkspaceSynchronizer.getFile(diagramResource));
+				}
+				if (nextEObject instanceof Diagram) {
+					break;
+				}
+			}
+			URI uri = EcoreUtil.getURI(diagram);
+			String editorName = uri.lastSegment() + '#' + diagram.eResource().getContents().indexOf(diagram);
+			IEditorInput editorInput = new URIEditorInput(uri, editorName);
+			return editorInput;
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorContentProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorContentProvider.java
new file mode 100644
index 0000000..0f6e05d
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorContentProvider.java
@@ -0,0 +1,662 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerContainerCompartment2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerContainerCompartmentEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.Messages;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.navigator.ICommonContentExtensionSite;
+import org.eclipse.ui.navigator.ICommonContentProvider;
+
+/**
+ * @generated
+ */
+public class LinklfNavigatorContentProvider implements ICommonContentProvider {
+
+	/**
+	 * @generated
+	 */
+	private static final Object[] EMPTY_ARRAY = new Object[0];
+
+	/**
+	 * @generated
+	 */
+	private Viewer myViewer;
+
+	/**
+	 * @generated
+	 */
+	private AdapterFactoryEditingDomain myEditingDomain;
+
+	/**
+	 * @generated
+	 */
+	private WorkspaceSynchronizer myWorkspaceSynchronizer;
+
+	/**
+	 * @generated
+	 */
+	private Runnable myViewerRefreshRunnable;
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings({ "unchecked", "serial", "rawtypes" })
+	public LinklfNavigatorContentProvider() {
+		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE.createEditingDomain();
+		myEditingDomain = (AdapterFactoryEditingDomain) editingDomain;
+		myEditingDomain.setResourceToReadOnlyMap(new HashMap() {
+
+			public Object get(Object key) {
+				if (!containsKey(key)) {
+					put(key, Boolean.TRUE);
+				}
+				return super.get(key);
+			}
+		});
+		myViewerRefreshRunnable = new Runnable() {
+
+			public void run() {
+				if (myViewer != null) {
+					myViewer.refresh();
+				}
+			}
+		};
+		myWorkspaceSynchronizer = new WorkspaceSynchronizer(editingDomain, new WorkspaceSynchronizer.Delegate() {
+
+			public void dispose() {
+			}
+
+			public boolean handleResourceChanged(final Resource resource) {
+				unloadAllResources();
+				asyncRefresh();
+				return true;
+			}
+
+			public boolean handleResourceDeleted(Resource resource) {
+				unloadAllResources();
+				asyncRefresh();
+				return true;
+			}
+
+			public boolean handleResourceMoved(Resource resource, final URI newURI) {
+				unloadAllResources();
+				asyncRefresh();
+				return true;
+			}
+		});
+	}
+
+	/**
+	 * @generated
+	 */
+	public void dispose() {
+		myWorkspaceSynchronizer.dispose();
+		myWorkspaceSynchronizer = null;
+		myViewerRefreshRunnable = null;
+		myViewer = null;
+		unloadAllResources();
+		((TransactionalEditingDomain) myEditingDomain).dispose();
+		myEditingDomain = null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		myViewer = viewer;
+	}
+
+	/**
+	 * @generated
+	 */
+	void unloadAllResources() {
+		for (Resource nextResource : myEditingDomain.getResourceSet().getResources()) {
+			nextResource.unload();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	void asyncRefresh() {
+		if (myViewer != null && !myViewer.getControl().isDisposed()) {
+			myViewer.getControl().getDisplay().asyncExec(myViewerRefreshRunnable);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object[] getElements(Object inputElement) {
+		return getChildren(inputElement);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void restoreState(IMemento aMemento) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public void saveState(IMemento aMemento) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public void init(ICommonContentExtensionSite aConfig) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object[] getChildren(Object parentElement) {
+		if (parentElement instanceof IFile) {
+			IFile file = (IFile) parentElement;
+			URI fileURI = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
+			Resource resource = myEditingDomain.getResourceSet().getResource(fileURI, true);
+			ArrayList<LinklfNavigatorItem> result = new ArrayList<LinklfNavigatorItem>();
+			ArrayList<View> topViews = new ArrayList<View>(resource.getContents().size());
+			for (EObject o : resource.getContents()) {
+				if (o instanceof View) {
+					topViews.add((View) o);
+				}
+			}
+			result.addAll(createNavigatorItems(selectViewsByType(topViews, CanvasEditPart.MODEL_ID), file, false));
+			return result.toArray();
+		}
+
+		if (parentElement instanceof LinklfNavigatorGroup) {
+			LinklfNavigatorGroup group = (LinklfNavigatorGroup) parentElement;
+			return group.getChildren();
+		}
+
+		if (parentElement instanceof LinklfNavigatorItem) {
+			LinklfNavigatorItem navigatorItem = (LinklfNavigatorItem) parentElement;
+			if (navigatorItem.isLeaf() || !isOwnView(navigatorItem.getView())) {
+				return EMPTY_ARRAY;
+			}
+			return getViewChildren(navigatorItem.getView(), parentElement);
+		}
+
+		return EMPTY_ARRAY;
+	}
+
+	/**
+	 * @generated
+	 */
+	private Object[] getViewChildren(View view, Object parentElement) {
+		switch (LinklfVisualIDRegistry.getVisualID(view)) {
+
+		case CanvasEditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Diagram sv = (Diagram) view;
+			LinklfNavigatorGroup links = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Canvas_1000_links, "icons/linksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			Collection<View> connectedViews;
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(CircleEditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(RectangleEditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(ContainerEditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(RhombusEditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getDiagramLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			links.addChildren(createNavigatorItems(connectedViews, links, false));
+			connectedViews = getDiagramLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			links.addChildren(createNavigatorItems(connectedViews, links, false));
+			if (!links.isEmpty()) {
+				result.add(links);
+			}
+			return result.toArray();
+		}
+
+		case CircleEditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Node sv = (Node) view;
+			LinklfNavigatorGroup incominglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Circle_2001_incominglinks, "icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			LinklfNavigatorGroup outgoinglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Circle_2001_outgoinglinks, "icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			Collection<View> connectedViews;
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			if (!incominglinks.isEmpty()) {
+				result.add(incominglinks);
+			}
+			if (!outgoinglinks.isEmpty()) {
+				result.add(outgoinglinks);
+			}
+			return result.toArray();
+		}
+
+		case RectangleEditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Node sv = (Node) view;
+			LinklfNavigatorGroup incominglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Rectangle_2002_incominglinks, "icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			LinklfNavigatorGroup outgoinglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Rectangle_2002_outgoinglinks, "icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			Collection<View> connectedViews;
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			if (!incominglinks.isEmpty()) {
+				result.add(incominglinks);
+			}
+			if (!outgoinglinks.isEmpty()) {
+				result.add(outgoinglinks);
+			}
+			return result.toArray();
+		}
+
+		case ContainerEditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Node sv = (Node) view;
+			Collection<View> connectedViews;
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(ContainerContainerCompartmentEditPart.VISUAL_ID));
+			connectedViews = getChildrenByType(connectedViews, LinklfVisualIDRegistry.getType(Circle2EditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(ContainerContainerCompartmentEditPart.VISUAL_ID));
+			connectedViews = getChildrenByType(connectedViews, LinklfVisualIDRegistry.getType(Container2EditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(ContainerContainerCompartmentEditPart.VISUAL_ID));
+			connectedViews = getChildrenByType(connectedViews, LinklfVisualIDRegistry.getType(Rectangle2EditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(ContainerContainerCompartmentEditPart.VISUAL_ID));
+			connectedViews = getChildrenByType(connectedViews, LinklfVisualIDRegistry.getType(Rhombus2EditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(PortEditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			return result.toArray();
+		}
+
+		case RhombusEditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Node sv = (Node) view;
+			LinklfNavigatorGroup incominglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Rhombus_2004_incominglinks, "icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			LinklfNavigatorGroup outgoinglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Rhombus_2004_outgoinglinks, "icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			Collection<View> connectedViews;
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			if (!incominglinks.isEmpty()) {
+				result.add(incominglinks);
+			}
+			if (!outgoinglinks.isEmpty()) {
+				result.add(outgoinglinks);
+			}
+			return result.toArray();
+		}
+
+		case Circle2EditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Node sv = (Node) view;
+			LinklfNavigatorGroup incominglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Circle_3001_incominglinks, "icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			LinklfNavigatorGroup outgoinglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Circle_3001_outgoinglinks, "icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			Collection<View> connectedViews;
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			if (!incominglinks.isEmpty()) {
+				result.add(incominglinks);
+			}
+			if (!outgoinglinks.isEmpty()) {
+				result.add(outgoinglinks);
+			}
+			return result.toArray();
+		}
+
+		case Container2EditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Node sv = (Node) view;
+			Collection<View> connectedViews;
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(ContainerContainerCompartment2EditPart.VISUAL_ID));
+			connectedViews = getChildrenByType(connectedViews, LinklfVisualIDRegistry.getType(Circle2EditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(ContainerContainerCompartment2EditPart.VISUAL_ID));
+			connectedViews = getChildrenByType(connectedViews, LinklfVisualIDRegistry.getType(Container2EditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(ContainerContainerCompartment2EditPart.VISUAL_ID));
+			connectedViews = getChildrenByType(connectedViews, LinklfVisualIDRegistry.getType(Rectangle2EditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(ContainerContainerCompartment2EditPart.VISUAL_ID));
+			connectedViews = getChildrenByType(connectedViews, LinklfVisualIDRegistry.getType(Rhombus2EditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			connectedViews = getChildrenByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(PortEditPart.VISUAL_ID));
+			result.addAll(createNavigatorItems(connectedViews, parentElement, false));
+			return result.toArray();
+		}
+
+		case Rectangle2EditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Node sv = (Node) view;
+			LinklfNavigatorGroup incominglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Rectangle_3003_incominglinks, "icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			LinklfNavigatorGroup outgoinglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Rectangle_3003_outgoinglinks, "icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			Collection<View> connectedViews;
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			if (!incominglinks.isEmpty()) {
+				result.add(incominglinks);
+			}
+			if (!outgoinglinks.isEmpty()) {
+				result.add(outgoinglinks);
+			}
+			return result.toArray();
+		}
+
+		case Rhombus2EditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Node sv = (Node) view;
+			LinklfNavigatorGroup incominglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Rhombus_3004_incominglinks, "icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			LinklfNavigatorGroup outgoinglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Rhombus_3004_outgoinglinks, "icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			Collection<View> connectedViews;
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			if (!incominglinks.isEmpty()) {
+				result.add(incominglinks);
+			}
+			if (!outgoinglinks.isEmpty()) {
+				result.add(outgoinglinks);
+			}
+			return result.toArray();
+		}
+
+		case PortEditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Node sv = (Node) view;
+			LinklfNavigatorGroup incominglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Port_3005_incominglinks, "icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			LinklfNavigatorGroup outgoinglinks = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Port_3005_outgoinglinks, "icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			Collection<View> connectedViews;
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			connectedViews = getIncomingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			incominglinks.addChildren(createNavigatorItems(connectedViews, incominglinks, true));
+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+			outgoinglinks.addChildren(createNavigatorItems(connectedViews, outgoinglinks, true));
+			if (!incominglinks.isEmpty()) {
+				result.add(incominglinks);
+			}
+			if (!outgoinglinks.isEmpty()) {
+				result.add(outgoinglinks);
+			}
+			return result.toArray();
+		}
+
+		case LinkEditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Edge sv = (Edge) view;
+			LinklfNavigatorGroup target = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Link_4001_target, "icons/linkTargetNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			LinklfNavigatorGroup source = new LinklfNavigatorGroup(Messages.NavigatorGroupName_Link_4001_source, "icons/linkSourceNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			Collection<View> connectedViews;
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(CircleEditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(RectangleEditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(RhombusEditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Circle2EditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Rectangle2EditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Rhombus2EditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(PortEditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(CircleEditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(RectangleEditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(RhombusEditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Circle2EditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Rectangle2EditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Rhombus2EditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(PortEditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			if (!target.isEmpty()) {
+				result.add(target);
+			}
+			if (!source.isEmpty()) {
+				result.add(source);
+			}
+			return result.toArray();
+		}
+
+		case LabeledLinkEditPart.VISUAL_ID: {
+			LinkedList<LinklfAbstractNavigatorItem> result = new LinkedList<LinklfAbstractNavigatorItem>();
+			Edge sv = (Edge) view;
+			LinklfNavigatorGroup target = new LinklfNavigatorGroup(Messages.NavigatorGroupName_LabeledLink_4002_target, "icons/linkTargetNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			LinklfNavigatorGroup source = new LinklfNavigatorGroup(Messages.NavigatorGroupName_LabeledLink_4002_source, "icons/linkSourceNavigatorGroup.gif", parentElement); //$NON-NLS-1$
+			Collection<View> connectedViews;
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(CircleEditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(RectangleEditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(RhombusEditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Circle2EditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Rectangle2EditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Rhombus2EditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksTargetByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(PortEditPart.VISUAL_ID));
+			target.addChildren(createNavigatorItems(connectedViews, target, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(CircleEditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(RectangleEditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(RhombusEditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Circle2EditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Rectangle2EditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(Rhombus2EditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			connectedViews = getLinksSourceByType(Collections.singleton(sv), LinklfVisualIDRegistry.getType(PortEditPart.VISUAL_ID));
+			source.addChildren(createNavigatorItems(connectedViews, source, true));
+			if (!target.isEmpty()) {
+				result.add(target);
+			}
+			if (!source.isEmpty()) {
+				result.add(source);
+			}
+			return result.toArray();
+		}
+		}
+		return EMPTY_ARRAY;
+	}
+
+	/**
+	 * @generated
+	 */
+	private Collection<View> getLinksSourceByType(Collection<Edge> edges, String type) {
+		LinkedList<View> result = new LinkedList<View>();
+		for (Edge nextEdge : edges) {
+			View nextEdgeSource = nextEdge.getSource();
+			if (type.equals(nextEdgeSource.getType()) && isOwnView(nextEdgeSource)) {
+				result.add(nextEdgeSource);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private Collection<View> getLinksTargetByType(Collection<Edge> edges, String type) {
+		LinkedList<View> result = new LinkedList<View>();
+		for (Edge nextEdge : edges) {
+			View nextEdgeTarget = nextEdge.getTarget();
+			if (type.equals(nextEdgeTarget.getType()) && isOwnView(nextEdgeTarget)) {
+				result.add(nextEdgeTarget);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private Collection<View> getOutgoingLinksByType(Collection<? extends View> nodes, String type) {
+		LinkedList<View> result = new LinkedList<View>();
+		for (View nextNode : nodes) {
+			result.addAll(selectViewsByType(nextNode.getSourceEdges(), type));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private Collection<View> getIncomingLinksByType(Collection<? extends View> nodes, String type) {
+		LinkedList<View> result = new LinkedList<View>();
+		for (View nextNode : nodes) {
+			result.addAll(selectViewsByType(nextNode.getTargetEdges(), type));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private Collection<View> getChildrenByType(Collection<? extends View> nodes, String type) {
+		LinkedList<View> result = new LinkedList<View>();
+		for (View nextNode : nodes) {
+			result.addAll(selectViewsByType(nextNode.getChildren(), type));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private Collection<View> getDiagramLinksByType(Collection<Diagram> diagrams, String type) {
+		ArrayList<View> result = new ArrayList<View>();
+		for (Diagram nextDiagram : diagrams) {
+			result.addAll(selectViewsByType(nextDiagram.getEdges(), type));
+		}
+		return result;
+	}
+
+	// TODO refactor as static method
+	/**
+	 * @generated
+	 */
+	private Collection<View> selectViewsByType(Collection<View> views, String type) {
+		ArrayList<View> result = new ArrayList<View>();
+		for (View nextView : views) {
+			if (type.equals(nextView.getType()) && isOwnView(nextView)) {
+				result.add(nextView);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private boolean isOwnView(View view) {
+		return CanvasEditPart.MODEL_ID.equals(LinklfVisualIDRegistry.getModelID(view));
+	}
+
+	/**
+	 * @generated
+	 */
+	private Collection<LinklfNavigatorItem> createNavigatorItems(Collection<View> views, Object parent, boolean isLeafs) {
+		ArrayList<LinklfNavigatorItem> result = new ArrayList<LinklfNavigatorItem>(views.size());
+		for (View nextView : views) {
+			result.add(new LinklfNavigatorItem(nextView, parent, isLeafs));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object getParent(Object element) {
+		if (element instanceof LinklfAbstractNavigatorItem) {
+			LinklfAbstractNavigatorItem abstractNavigatorItem = (LinklfAbstractNavigatorItem) element;
+			return abstractNavigatorItem.getParent();
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean hasChildren(Object element) {
+		return element instanceof IFile || getChildren(element).length > 0;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorGroup.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorGroup.java
new file mode 100644
index 0000000..6682f58
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorGroup.java
@@ -0,0 +1,97 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import java.util.Collection;
+import java.util.LinkedList;
+
+/**
+ * @generated
+ */
+public class LinklfNavigatorGroup extends LinklfAbstractNavigatorItem {
+
+	/**
+	 * @generated
+	 */
+	private String myGroupName;
+
+	/**
+	 * @generated
+	 */
+	private String myIcon;
+
+	/**
+	 * @generated
+	 */
+	private Collection myChildren = new LinkedList();
+
+	/**
+	 * @generated
+	 */
+	LinklfNavigatorGroup(String groupName, String icon, Object parent) {
+		super(parent);
+		myGroupName = groupName;
+		myIcon = icon;
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getGroupName() {
+		return myGroupName;
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getIcon() {
+		return myIcon;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object[] getChildren() {
+		return myChildren.toArray();
+	}
+
+	/**
+	 * @generated
+	 */
+	public void addChildren(Collection children) {
+		myChildren.addAll(children);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void addChild(Object child) {
+		myChildren.add(child);
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean isEmpty() {
+		return myChildren.size() == 0;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean equals(Object obj) {
+		if (obj instanceof org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorGroup) {
+			org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorGroup anotherGroup = (org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorGroup) obj;
+			if (getGroupName().equals(anotherGroup.getGroupName())) {
+				return getParent().equals(anotherGroup.getParent());
+			}
+		}
+		return super.equals(obj);
+	}
+
+	/**
+	 * @generated
+	 */
+	public int hashCode() {
+		return getGroupName().hashCode();
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorItem.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorItem.java
new file mode 100644
index 0000000..89ae4de
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorItem.java
@@ -0,0 +1,84 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.gmf.runtime.notation.View;
+
+/**
+	 * @generated
+	 */
+public class LinklfNavigatorItem extends LinklfAbstractNavigatorItem {
+
+	/**
+	 * @generated
+	 */
+	static {
+		final Class[] supportedTypes = new Class[] { View.class, EObject.class };
+		Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {
+
+			public Object getAdapter(Object adaptableObject, Class adapterType) {
+				if (adaptableObject instanceof org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorItem && (adapterType == View.class || adapterType == EObject.class)) {
+					return ((org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorItem) adaptableObject).getView();
+				}
+				return null;
+			}
+
+			public Class[] getAdapterList() {
+				return supportedTypes;
+			}
+		}, org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorItem.class);
+	}
+
+	/**
+	 * @generated
+	 */
+	private View myView;
+
+	/**
+	 * @generated
+	 */
+	private boolean myLeaf = false;
+
+	/**
+	 * @generated
+	 */
+	public LinklfNavigatorItem(View view, Object parent, boolean isLeaf) {
+		super(parent);
+		myView = view;
+		myLeaf = isLeaf;
+	}
+
+	/**
+	 * @generated
+	 */
+	public View getView() {
+		return myView;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean isLeaf() {
+		return myLeaf;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean equals(Object obj) {
+		if (obj instanceof org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorItem) {
+			return EcoreUtil.getURI(getView()).equals(EcoreUtil.getURI(((org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorItem) obj).getView()));
+		}
+		return super.equals(obj);
+	}
+
+	/**
+	 * @generated
+	 */
+	public int hashCode() {
+		return EcoreUtil.getURI(getView()).hashCode();
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorLabelProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorLabelProvider.java
new file mode 100644
index 0000000..b69a7c2
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorLabelProvider.java
@@ -0,0 +1,341 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerName2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkSourceNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfParserProvider;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.viewers.ITreePathLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.ViewerLabel;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.navigator.ICommonContentExtensionSite;
+import org.eclipse.ui.navigator.ICommonLabelProvider;
+
+/**
+ * @generated
+ */
+public class LinklfNavigatorLabelProvider extends LabelProvider implements ICommonLabelProvider, ITreePathLabelProvider {
+
+	/**
+	 * @generated
+	 */
+	static {
+		LinklfDiagramEditorPlugin.getInstance().getImageRegistry().put("Navigator?UnknownElement", ImageDescriptor.getMissingImageDescriptor()); //$NON-NLS-1$
+		LinklfDiagramEditorPlugin.getInstance().getImageRegistry().put("Navigator?ImageNotFound", ImageDescriptor.getMissingImageDescriptor()); //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	public void updateLabel(ViewerLabel label, TreePath elementPath) {
+		Object element = elementPath.getLastSegment();
+		if (element instanceof LinklfNavigatorItem && !isOwnView(((LinklfNavigatorItem) element).getView())) {
+			return;
+		}
+		label.setText(getText(element));
+		label.setImage(getImage(element));
+	}
+
+	/**
+	 * @generated
+	 */
+	public Image getImage(Object element) {
+		if (element instanceof LinklfNavigatorGroup) {
+			LinklfNavigatorGroup group = (LinklfNavigatorGroup) element;
+			return LinklfDiagramEditorPlugin.getInstance().getBundledImage(group.getIcon());
+		}
+
+		if (element instanceof LinklfNavigatorItem) {
+			LinklfNavigatorItem navigatorItem = (LinklfNavigatorItem) element;
+			if (!isOwnView(navigatorItem.getView())) {
+				return super.getImage(element);
+			}
+			return getImage(navigatorItem.getView());
+		}
+
+		return super.getImage(element);
+	}
+
+	/**
+	 * @generated
+	 */
+	public Image getImage(View view) {
+		switch (LinklfVisualIDRegistry.getVisualID(view)) {
+		case CanvasEditPart.VISUAL_ID:
+			return getImage("Navigator?Diagram?http://linklf.gmf.eclipse.org?Canvas", LinklfElementTypes.Canvas_1000); //$NON-NLS-1$
+		case CircleEditPart.VISUAL_ID:
+			return getImage("Navigator?TopLevelNode?http://linklf.gmf.eclipse.org?Circle", LinklfElementTypes.Circle_2001); //$NON-NLS-1$
+		case RectangleEditPart.VISUAL_ID:
+			return getImage("Navigator?TopLevelNode?http://linklf.gmf.eclipse.org?Rectangle", LinklfElementTypes.Rectangle_2002); //$NON-NLS-1$
+		case ContainerEditPart.VISUAL_ID:
+			return getImage("Navigator?TopLevelNode?http://linklf.gmf.eclipse.org?Container", LinklfElementTypes.Container_2003); //$NON-NLS-1$
+		case RhombusEditPart.VISUAL_ID:
+			return getImage("Navigator?TopLevelNode?http://linklf.gmf.eclipse.org?Rhombus", LinklfElementTypes.Rhombus_2004); //$NON-NLS-1$
+		case Circle2EditPart.VISUAL_ID:
+			return getImage("Navigator?Node?http://linklf.gmf.eclipse.org?Circle", LinklfElementTypes.Circle_3001); //$NON-NLS-1$
+		case Container2EditPart.VISUAL_ID:
+			return getImage("Navigator?Node?http://linklf.gmf.eclipse.org?Container", LinklfElementTypes.Container_3002); //$NON-NLS-1$
+		case Rectangle2EditPart.VISUAL_ID:
+			return getImage("Navigator?Node?http://linklf.gmf.eclipse.org?Rectangle", LinklfElementTypes.Rectangle_3003); //$NON-NLS-1$
+		case Rhombus2EditPart.VISUAL_ID:
+			return getImage("Navigator?Node?http://linklf.gmf.eclipse.org?Rhombus", LinklfElementTypes.Rhombus_3004); //$NON-NLS-1$
+		case PortEditPart.VISUAL_ID:
+			return getImage("Navigator?Node?http://linklf.gmf.eclipse.org?Port", LinklfElementTypes.Port_3005); //$NON-NLS-1$
+		case LinkEditPart.VISUAL_ID:
+			return getImage("Navigator?Link?http://linklf.gmf.eclipse.org?Link", LinklfElementTypes.Link_4001); //$NON-NLS-1$
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getImage("Navigator?Link?http://linklf.gmf.eclipse.org?LabeledLink", LinklfElementTypes.LabeledLink_4002); //$NON-NLS-1$
+		}
+		return getImage("Navigator?UnknownElement", null); //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private Image getImage(String key, IElementType elementType) {
+		ImageRegistry imageRegistry = LinklfDiagramEditorPlugin.getInstance().getImageRegistry();
+		Image image = imageRegistry.get(key);
+		if (image == null && elementType != null && LinklfElementTypes.isKnownElementType(elementType)) {
+			image = LinklfElementTypes.getImage(elementType);
+			imageRegistry.put(key, image);
+		}
+
+		if (image == null) {
+			image = imageRegistry.get("Navigator?ImageNotFound"); //$NON-NLS-1$
+			imageRegistry.put(key, image);
+		}
+		return image;
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getText(Object element) {
+		if (element instanceof LinklfNavigatorGroup) {
+			LinklfNavigatorGroup group = (LinklfNavigatorGroup) element;
+			return group.getGroupName();
+		}
+
+		if (element instanceof LinklfNavigatorItem) {
+			LinklfNavigatorItem navigatorItem = (LinklfNavigatorItem) element;
+			if (!isOwnView(navigatorItem.getView())) {
+				return null;
+			}
+			return getText(navigatorItem.getView());
+		}
+
+		return super.getText(element);
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getText(View view) {
+		if (view.getElement() != null && view.getElement().eIsProxy()) {
+			return getUnresolvedDomainElementProxyText(view);
+		}
+		switch (LinklfVisualIDRegistry.getVisualID(view)) {
+		case CanvasEditPart.VISUAL_ID:
+			return getCanvas_1000Text(view);
+		case CircleEditPart.VISUAL_ID:
+			return getCircle_2001Text(view);
+		case RectangleEditPart.VISUAL_ID:
+			return getRectangle_2002Text(view);
+		case ContainerEditPart.VISUAL_ID:
+			return getContainer_2003Text(view);
+		case RhombusEditPart.VISUAL_ID:
+			return getRhombus_2004Text(view);
+		case Circle2EditPart.VISUAL_ID:
+			return getCircle_3001Text(view);
+		case Container2EditPart.VISUAL_ID:
+			return getContainer_3002Text(view);
+		case Rectangle2EditPart.VISUAL_ID:
+			return getRectangle_3003Text(view);
+		case Rhombus2EditPart.VISUAL_ID:
+			return getRhombus_3004Text(view);
+		case PortEditPart.VISUAL_ID:
+			return getPort_3005Text(view);
+		case LinkEditPart.VISUAL_ID:
+			return getLink_4001Text(view);
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getLabeledLink_4002Text(view);
+		}
+		return getUnknownElementText(view);
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getCanvas_1000Text(View view) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getCircle_2001Text(View view) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getRectangle_2002Text(View view) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getContainer_2003Text(View view) {
+		IParser parser = LinklfParserProvider.getParser(LinklfElementTypes.Container_2003, view.getElement() != null ? view.getElement() : view,
+				LinklfVisualIDRegistry.getType(ContainerNameEditPart.VISUAL_ID));
+		if (parser != null) {
+			return parser.getPrintString(new EObjectAdapter(view.getElement() != null ? view.getElement() : view), ParserOptions.NONE.intValue());
+		} else {
+			LinklfDiagramEditorPlugin.getInstance().logError("Parser was not found for label " + 5002); //$NON-NLS-1$
+			return ""; //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getRhombus_2004Text(View view) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getCircle_3001Text(View view) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getContainer_3002Text(View view) {
+		IParser parser = LinklfParserProvider.getParser(LinklfElementTypes.Container_3002, view.getElement() != null ? view.getElement() : view,
+				LinklfVisualIDRegistry.getType(ContainerName2EditPart.VISUAL_ID));
+		if (parser != null) {
+			return parser.getPrintString(new EObjectAdapter(view.getElement() != null ? view.getElement() : view), ParserOptions.NONE.intValue());
+		} else {
+			LinklfDiagramEditorPlugin.getInstance().logError("Parser was not found for label " + 5001); //$NON-NLS-1$
+			return ""; //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getRectangle_3003Text(View view) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getRhombus_3004Text(View view) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getPort_3005Text(View view) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getLink_4001Text(View view) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getLabeledLink_4002Text(View view) {
+		IParser parser = LinklfParserProvider.getParser(LinklfElementTypes.LabeledLink_4002, view.getElement() != null ? view.getElement() : view,
+				LinklfVisualIDRegistry.getType(LabeledLinkSourceNameEditPart.VISUAL_ID));
+		if (parser != null) {
+			return parser.getPrintString(new EObjectAdapter(view.getElement() != null ? view.getElement() : view), ParserOptions.NONE.intValue());
+		} else {
+			LinklfDiagramEditorPlugin.getInstance().logError("Parser was not found for label " + 6001); //$NON-NLS-1$
+			return ""; //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getUnknownElementText(View view) {
+		return "<UnknownElement Visual_ID = " + view.getType() + ">"; //$NON-NLS-1$  //$NON-NLS-2$
+	}
+
+	/**
+	 * @generated
+	 */
+	private String getUnresolvedDomainElementProxyText(View view) {
+		return "<Unresolved domain element Visual_ID = " + view.getType() + ">"; //$NON-NLS-1$  //$NON-NLS-2$
+	}
+
+	/**
+	 * @generated
+	 */
+	public void init(ICommonContentExtensionSite aConfig) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public void restoreState(IMemento aMemento) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public void saveState(IMemento aMemento) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getDescription(Object anElement) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	private boolean isOwnView(View view) {
+		return CanvasEditPart.MODEL_ID.equals(LinklfVisualIDRegistry.getModelID(view));
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorLinkHelper.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorLinkHelper.java
new file mode 100644
index 0000000..8813a79
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorLinkHelper.java
@@ -0,0 +1,115 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.ui.URIEditorInput;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.navigator.ILinkHelper;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * @generated
+ */
+public class LinklfNavigatorLinkHelper implements ILinkHelper {
+
+	/**
+	 * @generated
+	 */
+	private static IEditorInput getEditorInput(Diagram diagram) {
+		Resource diagramResource = diagram.eResource();
+		for (EObject nextEObject : diagramResource.getContents()) {
+			if (nextEObject == diagram) {
+				return new FileEditorInput(WorkspaceSynchronizer.getFile(diagramResource));
+			}
+			if (nextEObject instanceof Diagram) {
+				break;
+			}
+		}
+		URI uri = EcoreUtil.getURI(diagram);
+		String editorName = uri.lastSegment() + '#' + diagram.eResource().getContents().indexOf(diagram);
+		IEditorInput editorInput = new URIEditorInput(uri, editorName);
+		return editorInput;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IStructuredSelection findSelection(IEditorInput anInput) {
+		IDiagramDocument document = LinklfDiagramEditorPlugin.getInstance().getDocumentProvider().getDiagramDocument(anInput);
+		if (document == null) {
+			return StructuredSelection.EMPTY;
+		}
+		Diagram diagram = document.getDiagram();
+		if (diagram == null || diagram.eResource() == null) {
+			return StructuredSelection.EMPTY;
+		}
+		IFile file = WorkspaceSynchronizer.getFile(diagram.eResource());
+		if (file != null) {
+			LinklfNavigatorItem item = new LinklfNavigatorItem(diagram, file, false);
+			return new StructuredSelection(item);
+		}
+		return StructuredSelection.EMPTY;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void activateEditor(IWorkbenchPage aPage, IStructuredSelection aSelection) {
+		if (aSelection == null || aSelection.isEmpty()) {
+			return;
+		}
+		if (false == aSelection.getFirstElement() instanceof LinklfAbstractNavigatorItem) {
+			return;
+		}
+
+		LinklfAbstractNavigatorItem abstractNavigatorItem = (LinklfAbstractNavigatorItem) aSelection.getFirstElement();
+		View navigatorView = null;
+		if (abstractNavigatorItem instanceof LinklfNavigatorItem) {
+			navigatorView = ((LinklfNavigatorItem) abstractNavigatorItem).getView();
+		} else if (abstractNavigatorItem instanceof LinklfNavigatorGroup) {
+			LinklfNavigatorGroup navigatorGroup = (LinklfNavigatorGroup) abstractNavigatorItem;
+			if (navigatorGroup.getParent() instanceof LinklfNavigatorItem) {
+				navigatorView = ((LinklfNavigatorItem) navigatorGroup.getParent()).getView();
+			}
+		}
+		if (navigatorView == null) {
+			return;
+		}
+		IEditorInput editorInput = getEditorInput(navigatorView.getDiagram());
+		IEditorPart editor = aPage.findEditor(editorInput);
+		if (editor == null) {
+			return;
+		}
+		aPage.bringToTop(editor);
+		if (editor instanceof DiagramEditor) {
+			DiagramEditor diagramEditor = (DiagramEditor) editor;
+			ResourceSet diagramEditorResourceSet = diagramEditor.getEditingDomain().getResourceSet();
+			EObject selectedView = diagramEditorResourceSet.getEObject(EcoreUtil.getURI(navigatorView), true);
+			if (selectedView == null) {
+				return;
+			}
+			GraphicalViewer graphicalViewer = (GraphicalViewer) diagramEditor.getAdapter(GraphicalViewer.class);
+			EditPart selectedEditPart = (EditPart) graphicalViewer.getEditPartRegistry().get(selectedView);
+			if (selectedEditPart != null) {
+				graphicalViewer.select(selectedEditPart);
+			}
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorSorter.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorSorter.java
new file mode 100644
index 0000000..c6373c9
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/navigator/LinklfNavigatorSorter.java
@@ -0,0 +1,27 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.navigator;
+
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * @generated
+ */
+public class LinklfNavigatorSorter extends ViewerSorter {
+
+	/**
+	 * @generated
+	 */
+	private static final int GROUP_CATEGORY = 7004;
+
+	/**
+	 * @generated
+	 */
+	public int category(Object element) {
+		if (element instanceof LinklfNavigatorItem) {
+			LinklfNavigatorItem item = (LinklfNavigatorItem) element;
+			return LinklfVisualIDRegistry.getVisualID(item.getView());
+		}
+		return GROUP_CATEGORY;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/parsers/AbstractParser.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/parsers/AbstractParser.java
new file mode 100644
index 0000000..f5b29e4
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/parsers/AbstractParser.java
@@ -0,0 +1 @@
+//Since GMFT 3.1 we don't generate class AbstractParser into every diagram, instead extend org.eclipse.gmf.tooling.runtime.parsers.AbstractAttributeParser.
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/parsers/MessageFormatParser.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/parsers/MessageFormatParser.java
new file mode 100644
index 0000000..4e32d0d
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/parsers/MessageFormatParser.java
@@ -0,0 +1,190 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.parsers;
+
+import java.text.FieldPosition;
+import java.text.MessageFormat;
+import java.text.ParsePosition;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.Messages;
+import org.eclipse.gmf.tooling.runtime.parsers.AbstractAttributeParser;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @generated
+ */
+public class MessageFormatParser extends AbstractAttributeParser {
+
+	/**
+	 * @generated
+	 */
+	private String defaultPattern;
+
+	/**
+	 * @generated
+	 */
+	private String defaultEditablePattern;
+
+	/**
+	 * @generated
+	 */
+	private MessageFormat viewProcessor;
+
+	/**
+	 * @generated
+	 */
+	private MessageFormat editorProcessor;
+
+	/**
+	 * @generated
+	 */
+	private MessageFormat editProcessor;
+
+	/**
+	 * @generated
+	 */
+	public MessageFormatParser(EAttribute[] features) {
+		super(features);
+	}
+
+	/**
+	 * @generated
+	 */
+	public MessageFormatParser(EAttribute[] features, EAttribute[] editableFeatures) {
+		super(features, editableFeatures);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getDefaultPattern() {
+		if (defaultPattern == null) {
+			StringBuffer sb = new StringBuffer();
+			for (int i = 0; i < features.length; i++) {
+				if (i > 0) {
+					sb.append(' ');
+				}
+				sb.append('{');
+				sb.append(i);
+				sb.append('}');
+			}
+			defaultPattern = sb.toString();
+		}
+		return defaultPattern;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setViewPattern(String viewPattern) {
+		super.setViewPattern(viewPattern);
+		viewProcessor = null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setEditorPattern(String editorPattern) {
+		super.setEditorPattern(editorPattern);
+		editorProcessor = null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected MessageFormat getViewProcessor() {
+		if (viewProcessor == null) {
+			viewProcessor = new MessageFormat(getViewPattern() == null ? getDefaultPattern() : getViewPattern());
+		}
+		return viewProcessor;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected MessageFormat getEditorProcessor() {
+		if (editorProcessor == null) {
+			editorProcessor = new MessageFormat(getEditorPattern() == null ? getDefaultEditablePattern() : getEditorPattern());
+		}
+		return editorProcessor;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getDefaultEditablePattern() {
+		if (defaultEditablePattern == null) {
+			StringBuffer sb = new StringBuffer();
+			for (int i = 0; i < editableFeatures.length; i++) {
+				if (i > 0) {
+					sb.append(' ');
+				}
+				sb.append('{');
+				sb.append(i);
+				sb.append('}');
+			}
+			defaultEditablePattern = sb.toString();
+		}
+		return defaultEditablePattern;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setEditPattern(String editPattern) {
+		super.setEditPattern(editPattern);
+		editProcessor = null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected MessageFormat getEditProcessor() {
+		if (editProcessor == null) {
+			editProcessor = new MessageFormat(getEditPattern() == null ? getDefaultEditablePattern() : getEditPattern());
+		}
+		return editProcessor;
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getEditString(IAdaptable adapter, int flags) {
+		EObject element = (EObject) adapter.getAdapter(EObject.class);
+		return getEditorProcessor().format(getEditableValues(element), new StringBuffer(), new FieldPosition(0)).toString();
+	}
+
+	/**
+	 * @generated
+	 */
+	public IParserEditStatus isValidEditString(IAdaptable adapter, String editString) {
+		ParsePosition pos = new ParsePosition(0);
+		Object[] values = getEditProcessor().parse(editString, pos);
+		if (values == null) {
+			return new ParserEditStatus(LinklfDiagramEditorPlugin.ID, IParserEditStatus.UNEDITABLE, NLS.bind(Messages.MessageFormatParser_InvalidInputError, new Integer(pos.getErrorIndex())));
+		}
+		return validateNewValues(values);
+	}
+
+	/**
+	 * @generated
+	 */
+	public ICommand getParseCommand(IAdaptable adapter, String newString, int flags) {
+		Object[] values = getEditProcessor().parse(newString, new ParsePosition(0));
+		return getParseCommand(adapter, values, flags);
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getPrintString(IAdaptable adapter, int flags) {
+		EObject element = (EObject) adapter.getAdapter(EObject.class);
+		return getViewProcessor().format(getValues(element), new StringBuffer(), new FieldPosition(0)).toString();
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/DeleteElementAction.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/DeleteElementAction.java
new file mode 100644
index 0000000..6e757b4
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/DeleteElementAction.java
@@ -0,0 +1,18 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.gmf.tooling.runtime.actions.DefaultDeleteElementAction;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @generated
+ */
+public class DeleteElementAction extends DefaultDeleteElementAction {
+
+	/**
+	 * @generated
+	 */
+	public DeleteElementAction(IWorkbenchPart part) {
+		super(part);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/DiagramEditorContextMenuProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/DiagramEditorContextMenuProvider.java
new file mode 100644
index 0000000..2a9c173
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/DiagramEditorContextMenuProvider.java
@@ -0,0 +1,66 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.ContributionItemService;
+import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
+import org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @generated
+ */
+public class DiagramEditorContextMenuProvider extends DiagramContextMenuProvider {
+
+	/**
+	 * @generated
+	 */
+	private IWorkbenchPart part;
+
+	/**
+	 * @generated
+	 */
+	private DeleteElementAction deleteAction;
+
+	/**
+	 * @generated
+	 */
+	public DiagramEditorContextMenuProvider(IWorkbenchPart part, EditPartViewer viewer) {
+		super(part, viewer);
+		this.part = part;
+		deleteAction = new DeleteElementAction(part);
+		deleteAction.init();
+	}
+
+	/**
+	 * @generated
+	 */
+	public void dispose() {
+		if (deleteAction != null) {
+			deleteAction.dispose();
+			deleteAction = null;
+		}
+		super.dispose();
+	}
+
+	/**
+	 * @generated
+	 */
+	public void buildContextMenu(final IMenuManager menu) {
+		getViewer().flush();
+		try {
+			TransactionUtil.getEditingDomain((EObject) getViewer().getContents().getModel()).runExclusive(new Runnable() {
+
+				public void run() {
+					ContributionItemService.getInstance().contributeToPopupMenu(DiagramEditorContextMenuProvider.this, part);
+					menu.remove(ActionIds.ACTION_DELETE_FROM_MODEL);
+					menu.appendToGroup("editGroup", deleteAction);
+				}
+			});
+		} catch (Exception e) {
+			LinklfDiagramEditorPlugin.getInstance().logError("Error building context menu", e);
+		}
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfCreationWizard.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfCreationWizard.java
new file mode 100644
index 0000000..b5d6b75
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfCreationWizard.java
@@ -0,0 +1,154 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+
+/**
+ * @generated
+ */
+public class LinklfCreationWizard extends Wizard implements INewWizard {
+
+	/**
+	 * @generated
+	 */
+	private IWorkbench workbench;
+
+	/**
+	 * @generated
+	 */
+	protected IStructuredSelection selection;
+
+	/**
+	 * @generated
+	 */
+	protected LinklfCreationWizardPage diagramModelFilePage;
+
+	/**
+	 * @generated
+	 */
+	protected LinklfCreationWizardPage domainModelFilePage;
+
+	/**
+	 * @generated
+	 */
+	protected Resource diagram;
+
+	/**
+	 * @generated
+	 */
+	private boolean openNewlyCreatedDiagramEditor = true;
+
+	/**
+	 * @generated
+	 */
+	public IWorkbench getWorkbench() {
+		return workbench;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IStructuredSelection getSelection() {
+		return selection;
+	}
+
+	/**
+	 * @generated
+	 */
+	public final Resource getDiagram() {
+		return diagram;
+	}
+
+	/**
+	 * @generated
+	 */
+	public final boolean isOpenNewlyCreatedDiagramEditor() {
+		return openNewlyCreatedDiagramEditor;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setOpenNewlyCreatedDiagramEditor(boolean openNewlyCreatedDiagramEditor) {
+		this.openNewlyCreatedDiagramEditor = openNewlyCreatedDiagramEditor;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		this.workbench = workbench;
+		this.selection = selection;
+		setWindowTitle(Messages.LinklfCreationWizardTitle);
+		setDefaultPageImageDescriptor(LinklfDiagramEditorPlugin.getBundledImageDescriptor("icons/wizban/NewLinklfWizard.gif")); //$NON-NLS-1$
+		setNeedsProgressMonitor(true);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void addPages() {
+		diagramModelFilePage = new LinklfCreationWizardPage("DiagramModelFile", getSelection(), "linklf_diagram"); //$NON-NLS-1$ //$NON-NLS-2$
+		diagramModelFilePage.setTitle(Messages.LinklfCreationWizard_DiagramModelFilePageTitle);
+		diagramModelFilePage.setDescription(Messages.LinklfCreationWizard_DiagramModelFilePageDescription);
+		addPage(diagramModelFilePage);
+
+		domainModelFilePage = new LinklfCreationWizardPage("DomainModelFile", getSelection(), "linklf") { //$NON-NLS-1$ //$NON-NLS-2$
+
+			public void setVisible(boolean visible) {
+				if (visible) {
+					String fileName = diagramModelFilePage.getFileName();
+					fileName = fileName.substring(0, fileName.length() - ".linklf_diagram".length()); //$NON-NLS-1$
+					setFileName(LinklfDiagramEditorUtil.getUniqueFileName(getContainerFullPath(), fileName, "linklf")); //$NON-NLS-1$
+				}
+				super.setVisible(visible);
+			}
+		};
+		domainModelFilePage.setTitle(Messages.LinklfCreationWizard_DomainModelFilePageTitle);
+		domainModelFilePage.setDescription(Messages.LinklfCreationWizard_DomainModelFilePageDescription);
+		addPage(domainModelFilePage);
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean performFinish() {
+		IRunnableWithProgress op = new WorkspaceModifyOperation(null) {
+
+			protected void execute(IProgressMonitor monitor) throws CoreException, InterruptedException {
+				diagram = LinklfDiagramEditorUtil.createDiagram(diagramModelFilePage.getURI(), domainModelFilePage.getURI(), monitor);
+				if (isOpenNewlyCreatedDiagramEditor() && diagram != null) {
+					try {
+						LinklfDiagramEditorUtil.openDiagram(diagram);
+					} catch (PartInitException e) {
+						ErrorDialog.openError(getContainer().getShell(), Messages.LinklfCreationWizardOpenEditorError, null, e.getStatus());
+					}
+				}
+			}
+		};
+		try {
+			getContainer().run(false, true, op);
+		} catch (InterruptedException e) {
+			return false;
+		} catch (InvocationTargetException e) {
+			if (e.getTargetException() instanceof CoreException) {
+				ErrorDialog.openError(getContainer().getShell(), Messages.LinklfCreationWizardCreationError, null, ((CoreException) e.getTargetException()).getStatus());
+			} else {
+				LinklfDiagramEditorPlugin.getInstance().logError("Error creating diagram", e.getTargetException()); //$NON-NLS-1$
+			}
+			return false;
+		}
+		return diagram != null;
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfCreationWizardPage.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfCreationWizardPage.java
new file mode 100644
index 0000000..61ab3de
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfCreationWizardPage.java
@@ -0,0 +1,83 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+
+/**
+ * @generated
+ */
+public class LinklfCreationWizardPage extends WizardNewFileCreationPage {
+
+	/**
+	 * @generated
+	 */
+	private final String fileExtension;
+
+	/**
+	 * @generated
+	 */
+	public LinklfCreationWizardPage(String pageName, IStructuredSelection selection, String fileExtension) {
+		super(pageName, selection);
+		this.fileExtension = fileExtension;
+	}
+
+	/**
+	 * Override to create files with this extension.
+	 * 
+	 * @generated
+	 */
+	protected String getExtension() {
+		return fileExtension;
+	}
+
+	/**
+	 * @generated
+	 */
+	public URI getURI() {
+		return URI.createPlatformResourceURI(getFilePath().toString(), false);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IPath getFilePath() {
+		IPath path = getContainerFullPath();
+		if (path == null) {
+			path = new Path(""); //$NON-NLS-1$
+		}
+		String fileName = getFileName();
+		if (fileName != null) {
+			path = path.append(fileName);
+		}
+		return path;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void createControl(Composite parent) {
+		super.createControl(parent);
+		setFileName(LinklfDiagramEditorUtil.getUniqueFileName(getContainerFullPath(), getFileName(), getExtension()));
+		setPageComplete(validatePage());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean validatePage() {
+		if (!super.validatePage()) {
+			return false;
+		}
+		String extension = getExtension();
+		if (extension != null && !getFilePath().toString().endsWith("." + extension)) {
+			setErrorMessage(NLS.bind(Messages.LinklfCreationWizardPageExtensionError, extension));
+			return false;
+		}
+		return true;
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramActionBarContributor.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramActionBarContributor.java
new file mode 100644
index 0000000..e1a3fb6
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramActionBarContributor.java
@@ -0,0 +1,38 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramActionBarContributor;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+
+/**
+ * @generated
+ */
+public class LinklfDiagramActionBarContributor extends DiagramActionBarContributor {
+
+	/**
+	 * @generated
+	 */
+	protected Class getEditorClass() {
+		return LinklfDiagramEditor.class;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getEditorId() {
+		return LinklfDiagramEditor.ID;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void init(IActionBars bars, IWorkbenchPage page) {
+		super.init(bars, page);
+		// print preview
+		IMenuManager fileMenu = bars.getMenuManager().findMenuUsingPath(IWorkbenchActionConstants.M_FILE);
+		assert fileMenu != null;
+		fileMenu.remove("pageSetupAction"); //$NON-NLS-1$
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramEditor.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramEditor.java
new file mode 100644
index 0000000..8d3f440
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramEditor.java
@@ -0,0 +1,271 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.ui.URIEditorInput;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.gef.palette.PaletteRoot;
+import org.eclipse.gmf.runtime.common.ui.services.marker.MarkerNavigationService;
+import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
+import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorItem;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorMatchingStrategy;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+import org.eclipse.ui.ide.IGotoMarker;
+import org.eclipse.ui.navigator.resources.ProjectExplorer;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.IShowInTargetList;
+import org.eclipse.ui.part.ShowInContext;
+
+/**
+ * @generated
+ */
+public class LinklfDiagramEditor extends DiagramDocumentEditor implements IGotoMarker {
+
+	/**
+	 * @generated
+	 */
+	public static final String ID = "org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorID"; //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final String CONTEXT_ID = "org.eclipse.gmf.tooling.examples.linklf.diagram.ui.diagramContext"; //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public LinklfDiagramEditor() {
+		super(true);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected String getContextID() {
+		return CONTEXT_ID;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected PaletteRoot createPaletteRoot(PaletteRoot existingPaletteRoot) {
+		PaletteRoot root = super.createPaletteRoot(existingPaletteRoot);
+		new LinklfPaletteFactory().fillPalette(root);
+		return root;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected PreferencesHint getPreferencesHint() {
+		return LinklfDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
+	}
+
+	/**
+	 * @generated
+	 */
+	public String getContributorId() {
+		return LinklfDiagramEditorPlugin.ID;
+	}
+
+	/**
+	 * @generated
+	 */
+	@SuppressWarnings("rawtypes")
+	public Object getAdapter(Class type) {
+		if (type == IShowInTargetList.class) {
+			return new IShowInTargetList() {
+
+				public String[] getShowInTargetIds() {
+					return new String[] { ProjectExplorer.VIEW_ID };
+				}
+			};
+		}
+		return super.getAdapter(type);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IDocumentProvider getDocumentProvider(IEditorInput input) {
+		if (input instanceof IFileEditorInput || input instanceof URIEditorInput) {
+			return LinklfDiagramEditorPlugin.getInstance().getDocumentProvider();
+		}
+		return super.getDocumentProvider(input);
+	}
+
+	/**
+	 * @generated
+	 */
+	public TransactionalEditingDomain getEditingDomain() {
+		IDocument document = getEditorInput() != null ? getDocumentProvider().getDocument(getEditorInput()) : null;
+		if (document instanceof IDiagramDocument) {
+			return ((IDiagramDocument) document).getEditingDomain();
+		}
+		return super.getEditingDomain();
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setDocumentProvider(IEditorInput input) {
+		if (input instanceof IFileEditorInput || input instanceof URIEditorInput) {
+			setDocumentProvider(LinklfDiagramEditorPlugin.getInstance().getDocumentProvider());
+		} else {
+			super.setDocumentProvider(input);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public void gotoMarker(IMarker marker) {
+		MarkerNavigationService.getInstance().gotoMarker(this, marker);
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean isSaveAsAllowed() {
+		return true;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void doSaveAs() {
+		performSaveAs(new NullProgressMonitor());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void performSaveAs(IProgressMonitor progressMonitor) {
+		Shell shell = getSite().getShell();
+		IEditorInput input = getEditorInput();
+		SaveAsDialog dialog = new SaveAsDialog(shell);
+		IFile original = input instanceof IFileEditorInput ? ((IFileEditorInput) input).getFile() : null;
+		if (original != null) {
+			dialog.setOriginalFile(original);
+		}
+		dialog.create();
+		IDocumentProvider provider = getDocumentProvider();
+		if (provider == null) {
+			// editor has been programmatically closed while the dialog was open
+			return;
+		}
+		if (provider.isDeleted(input) && original != null) {
+			String message = NLS.bind(Messages.LinklfDiagramEditor_SavingDeletedFile, original.getName());
+			dialog.setErrorMessage(null);
+			dialog.setMessage(message, IMessageProvider.WARNING);
+		}
+		if (dialog.open() == Window.CANCEL) {
+			if (progressMonitor != null) {
+				progressMonitor.setCanceled(true);
+			}
+			return;
+		}
+		IPath filePath = dialog.getResult();
+		if (filePath == null) {
+			if (progressMonitor != null) {
+				progressMonitor.setCanceled(true);
+			}
+			return;
+		}
+		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
+		IFile file = workspaceRoot.getFile(filePath);
+		final IEditorInput newInput = new FileEditorInput(file);
+		// Check if the editor is already open
+		IEditorMatchingStrategy matchingStrategy = getEditorDescriptor().getEditorMatchingStrategy();
+		IEditorReference[] editorRefs = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditorReferences();
+		for (int i = 0; i < editorRefs.length; i++) {
+			if (matchingStrategy.matches(editorRefs[i], newInput)) {
+				MessageDialog.openWarning(shell, Messages.LinklfDiagramEditor_SaveAsErrorTitle, Messages.LinklfDiagramEditor_SaveAsErrorMessage);
+				return;
+			}
+		}
+		boolean success = false;
+		try {
+			provider.aboutToChange(newInput);
+			getDocumentProvider(newInput).saveDocument(progressMonitor, newInput, getDocumentProvider().getDocument(getEditorInput()), true);
+			success = true;
+		} catch (CoreException x) {
+			IStatus status = x.getStatus();
+			if (status == null || status.getSeverity() != IStatus.CANCEL) {
+				ErrorDialog.openError(shell, Messages.LinklfDiagramEditor_SaveErrorTitle, Messages.LinklfDiagramEditor_SaveErrorMessage, x.getStatus());
+			}
+		} finally {
+			provider.changed(newInput);
+			if (success) {
+				setInput(newInput);
+			}
+		}
+		if (progressMonitor != null) {
+			progressMonitor.setCanceled(!success);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public ShowInContext getShowInContext() {
+		return new ShowInContext(getEditorInput(), getNavigatorSelection());
+	}
+
+	/**
+	 * @generated
+	 */
+	private ISelection getNavigatorSelection() {
+		IDiagramDocument document = getDiagramDocument();
+		if (document == null) {
+			return StructuredSelection.EMPTY;
+		}
+		Diagram diagram = document.getDiagram();
+		if (diagram == null || diagram.eResource() == null) {
+			return StructuredSelection.EMPTY;
+		}
+		IFile file = WorkspaceSynchronizer.getFile(diagram.eResource());
+		if (file != null) {
+			LinklfNavigatorItem item = new LinklfNavigatorItem(diagram, file, false);
+			return new StructuredSelection(item);
+		}
+		return StructuredSelection.EMPTY;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void configureGraphicalViewer() {
+		super.configureGraphicalViewer();
+		DiagramEditorContextMenuProvider provider = new DiagramEditorContextMenuProvider(this, getDiagramGraphicalViewer());
+		getDiagramGraphicalViewer().setContextMenu(provider);
+		getSite().registerContextMenu(ActionIds.DIAGRAM_EDITOR_CONTEXT_MENU, provider, getDiagramGraphicalViewer());
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramEditorPlugin.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramEditorPlugin.java
new file mode 100644
index 0000000..5a37b7f
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramEditorPlugin.java
@@ -0,0 +1,270 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
+import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
+import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.policies.LinklfBaseItemSemanticEditPolicy;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.ElementInitializers;
+import org.eclipse.gmf.tooling.examples.linklf.provider.LinklfItemProviderAdapterFactory;
+import org.eclipse.gmf.tooling.runtime.LogHelper;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+	 * @generated
+	 */
+public class LinklfDiagramEditorPlugin extends AbstractUIPlugin {
+
+	/**
+	 * @generated
+	 */
+	public static final String ID = "org.eclipse.gmf.tooling.examples.linklf.diagram"; //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	private LogHelper myLogHelper;
+
+	/**
+	 * @generated
+	 */
+	public static final PreferencesHint DIAGRAM_PREFERENCES_HINT = new PreferencesHint(ID);
+
+	/**
+	 * @generated
+	 */
+	private static LinklfDiagramEditorPlugin instance;
+
+	/**
+	 * @generated
+	 */
+	private ComposedAdapterFactory adapterFactory;
+
+	/**
+	 * @generated
+	 */
+	private LinklfDocumentProvider documentProvider;
+
+	/**
+	 * @generated
+	 */
+	private LinklfBaseItemSemanticEditPolicy.LinkConstraints linkConstraints;
+
+	/**
+	 * @generated
+	 */
+	private ElementInitializers initializers;
+
+	/**
+	 * @generated
+	 */
+	public LinklfDiagramEditorPlugin() {
+	}
+
+	/**
+	 * @generated
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		instance = this;
+		myLogHelper = new LogHelper(this);
+		PreferencesHint.registerPreferenceStore(DIAGRAM_PREFERENCES_HINT, getPreferenceStore());
+		adapterFactory = createAdapterFactory();
+	}
+
+	/**
+	 * @generated
+	 */
+	public void stop(BundleContext context) throws Exception {
+		adapterFactory.dispose();
+		adapterFactory = null;
+		linkConstraints = null;
+		initializers = null;
+		instance = null;
+		super.stop(context);
+	}
+
+	/**
+	 * @generated
+	 */
+	public static LinklfDiagramEditorPlugin getInstance() {
+		return instance;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected ComposedAdapterFactory createAdapterFactory() {
+		ArrayList<AdapterFactory> factories = new ArrayList<AdapterFactory>();
+		fillItemProviderFactories(factories);
+		return new ComposedAdapterFactory(factories);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void fillItemProviderFactories(List<AdapterFactory> factories) {
+		factories.add(new LinklfItemProviderAdapterFactory());
+		factories.add(new ResourceItemProviderAdapterFactory());
+		factories.add(new ReflectiveItemProviderAdapterFactory());
+	}
+
+	/**
+	 * @generated
+	 */
+	public AdapterFactory getItemProvidersAdapterFactory() {
+		return adapterFactory;
+	}
+
+	/**
+	 * @generated
+	 */
+	public ImageDescriptor getItemImageDescriptor(Object item) {
+		IItemLabelProvider labelProvider = (IItemLabelProvider) adapterFactory.adapt(item, IItemLabelProvider.class);
+		if (labelProvider != null) {
+			return ExtendedImageRegistry.getInstance().getImageDescriptor(labelProvider.getImage(item));
+		}
+		return null;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path.
+	 * 
+	 * @generated
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getBundledImageDescriptor(String path) {
+		return AbstractUIPlugin.imageDescriptorFromPlugin(ID, path);
+	}
+
+	/**
+	 * Respects images residing in any plug-in. If path is relative,
+	 * then this bundle is looked up for the image, otherwise, for absolute
+	 * path, first segment is taken as id of plug-in with image
+	 * 
+	 * @generated
+	 * @param path the path to image, either absolute (with plug-in id as first segment), or relative for bundled images
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor findImageDescriptor(String path) {
+		final IPath p = new Path(path);
+		if (p.isAbsolute() && p.segmentCount() > 1) {
+			return AbstractUIPlugin.imageDescriptorFromPlugin(p.segment(0), p.removeFirstSegments(1).makeAbsolute().toString());
+		} else {
+			return getBundledImageDescriptor(p.makeAbsolute().toString());
+		}
+	}
+
+	/**
+	 * Returns an image for the image file at the given plugin relative path.
+	 * Client do not need to dispose this image. Images will be disposed automatically.
+	 * 
+	 * @generated
+	 * @param path the path
+	 * @return image instance
+	 */
+	public Image getBundledImage(String path) {
+		Image image = getImageRegistry().get(path);
+		if (image == null) {
+			getImageRegistry().put(path, getBundledImageDescriptor(path));
+			image = getImageRegistry().get(path);
+		}
+		return image;
+	}
+
+	/**
+	 * Returns string from plug-in's resource bundle
+	 * 
+	 * @generated
+	 */
+	public static String getString(String key) {
+		return Platform.getResourceString(getInstance().getBundle(), "%" + key); //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	public LinklfDocumentProvider getDocumentProvider() {
+		if (documentProvider == null) {
+			documentProvider = new LinklfDocumentProvider();
+		}
+		return documentProvider;
+	}
+
+	/**
+	 * @generated
+	 */
+	public LinklfBaseItemSemanticEditPolicy.LinkConstraints getLinkConstraints() {
+		return linkConstraints;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setLinkConstraints(LinklfBaseItemSemanticEditPolicy.LinkConstraints lc) {
+		this.linkConstraints = lc;
+	}
+
+	/**
+	 * @generated
+	 */
+	public ElementInitializers getElementInitializers() {
+		return initializers;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void setElementInitializers(ElementInitializers i) {
+		this.initializers = i;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void logError(String error) {
+		getLogHelper().logError(error, null);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void logError(String error, Throwable throwable) {
+		getLogHelper().logError(error, throwable);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void logInfo(String message) {
+		getLogHelper().logInfo(message, null);
+	}
+
+	/**
+	 * @generated
+	 */
+	public void logInfo(String message, Throwable throwable) {
+		getLogHelper().logInfo(message, throwable);
+	}
+
+	/**
+	 * @generated
+	 */
+	public LogHelper getLogHelper() {
+		return myLogHelper;
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramEditorUtil.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramEditorUtil.java
new file mode 100644
index 0000000..a3c2507
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramEditorUtil.java
@@ -0,0 +1,345 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.operations.OperationHistoryFactory;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
+import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
+import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.Canvas;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfFactory;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.gmf.tooling.runtime.part.DefaultDiagramEditorUtil;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * @generated
+ */
+public class LinklfDiagramEditorUtil {
+
+	/**
+	 * @generated
+	 */
+	public static Map<?, ?> getSaveOptions() {
+		HashMap<String, Object> saveOptions = new HashMap<String, Object>();
+		saveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
+		saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
+		return saveOptions;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static boolean openDiagram(Resource diagram) throws PartInitException {
+		String path = diagram.getURI().toPlatformString(true);
+		IResource workspaceResource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
+		if (workspaceResource instanceof IFile) {
+			IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+			return null != page.openEditor(new FileEditorInput((IFile) workspaceResource), LinklfDiagramEditor.ID);
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static void setCharset(IFile file) {
+		if (file == null) {
+			return;
+		}
+		try {
+			file.setCharset("UTF-8", new NullProgressMonitor()); //$NON-NLS-1$
+		} catch (CoreException e) {
+			LinklfDiagramEditorPlugin.getInstance().logError("Unable to set charset for file " + file.getFullPath(), e); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public static String getUniqueFileName(IPath containerFullPath, String fileName, String extension) {
+		return DefaultDiagramEditorUtil.getUniqueFileName(containerFullPath, fileName, extension, DefaultDiagramEditorUtil.EXISTS_IN_WORKSPACE);
+	}
+
+	/**
+	 * Runs the wizard in a dialog.
+	 * 
+	 * @generated
+	 */
+	public static void runWizard(Shell shell, Wizard wizard, String settingsKey) {
+		IDialogSettings pluginDialogSettings = LinklfDiagramEditorPlugin.getInstance().getDialogSettings();
+		IDialogSettings wizardDialogSettings = pluginDialogSettings.getSection(settingsKey);
+		if (wizardDialogSettings == null) {
+			wizardDialogSettings = pluginDialogSettings.addNewSection(settingsKey);
+		}
+		wizard.setDialogSettings(wizardDialogSettings);
+		WizardDialog dialog = new WizardDialog(shell, wizard);
+		dialog.create();
+		dialog.getShell().setSize(Math.max(500, dialog.getShell().getSize().x), 500);
+		dialog.open();
+	}
+
+	/**
+	 * This method should be called within a workspace modify operation since it creates resources.
+	 * @generated
+	 */
+	public static Resource createDiagram(URI diagramURI, URI modelURI, IProgressMonitor progressMonitor) {
+		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE.createEditingDomain();
+		progressMonitor.beginTask(Messages.LinklfDiagramEditorUtil_CreateDiagramProgressTask, 3);
+		final Resource diagramResource = editingDomain.getResourceSet().createResource(diagramURI);
+		final Resource modelResource = editingDomain.getResourceSet().createResource(modelURI);
+		final String diagramName = diagramURI.lastSegment();
+		AbstractTransactionalCommand command = new AbstractTransactionalCommand(editingDomain, Messages.LinklfDiagramEditorUtil_CreateDiagramCommandLabel, Collections.EMPTY_LIST) {
+
+			protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+				Canvas model = createInitialModel();
+				attachModelToResource(model, modelResource);
+
+				Diagram diagram = ViewService.createDiagram(model, CanvasEditPart.MODEL_ID, LinklfDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
+				if (diagram != null) {
+					diagramResource.getContents().add(diagram);
+					diagram.setName(diagramName);
+					diagram.setElement(model);
+				}
+
+				try {
+					modelResource.save(org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorUtil.getSaveOptions());
+					diagramResource.save(org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorUtil.getSaveOptions());
+				} catch (IOException e) {
+
+					LinklfDiagramEditorPlugin.getInstance().logError("Unable to store model and diagram resources", e); //$NON-NLS-1$
+				}
+				return CommandResult.newOKCommandResult();
+			}
+		};
+		try {
+			OperationHistoryFactory.getOperationHistory().execute(command, new SubProgressMonitor(progressMonitor, 1), null);
+		} catch (ExecutionException e) {
+			LinklfDiagramEditorPlugin.getInstance().logError("Unable to create model and diagram", e); //$NON-NLS-1$
+		}
+		setCharset(WorkspaceSynchronizer.getFile(modelResource));
+		setCharset(WorkspaceSynchronizer.getFile(diagramResource));
+		return diagramResource;
+	}
+
+	/**
+	 * Create a new instance of domain element associated with canvas.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static Canvas createInitialModel() {
+		return LinklfFactory.eINSTANCE.createCanvas();
+	}
+
+	/**
+	 * Store model element in the resource.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static void attachModelToResource(Canvas model, Resource resource) {
+		resource.getContents().add(model);
+	}
+
+	/**
+	 * @generated
+	 */
+	public static void selectElementsInDiagram(IDiagramWorkbenchPart diagramPart, List<EditPart> editParts) {
+		diagramPart.getDiagramGraphicalViewer().deselectAll();
+
+		EditPart firstPrimary = null;
+		for (EditPart nextPart : editParts) {
+			diagramPart.getDiagramGraphicalViewer().appendSelection(nextPart);
+			if (firstPrimary == null && nextPart instanceof IPrimaryEditPart) {
+				firstPrimary = nextPart;
+			}
+		}
+
+		if (!editParts.isEmpty()) {
+			diagramPart.getDiagramGraphicalViewer().reveal(firstPrimary != null ? firstPrimary : (EditPart) editParts.get(0));
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private static int findElementsInDiagramByID(DiagramEditPart diagramPart, EObject element, List<EditPart> editPartCollector) {
+		IDiagramGraphicalViewer viewer = (IDiagramGraphicalViewer) diagramPart.getViewer();
+		final int intialNumOfEditParts = editPartCollector.size();
+
+		if (element instanceof View) { // support notation element lookup
+			EditPart editPart = (EditPart) viewer.getEditPartRegistry().get(element);
+			if (editPart != null) {
+				editPartCollector.add(editPart);
+				return 1;
+			}
+		}
+
+		String elementID = EMFCoreUtil.getProxyID(element);
+		@SuppressWarnings("unchecked")
+		List<EditPart> associatedParts = viewer.findEditPartsForElement(elementID, IGraphicalEditPart.class);
+		// perform the possible hierarchy disjoint -> take the top-most parts only
+		for (EditPart nextPart : associatedParts) {
+			EditPart parentPart = nextPart.getParent();
+			while (parentPart != null && !associatedParts.contains(parentPart)) {
+				parentPart = parentPart.getParent();
+			}
+			if (parentPart == null) {
+				editPartCollector.add(nextPart);
+			}
+		}
+
+		if (intialNumOfEditParts == editPartCollector.size()) {
+			if (!associatedParts.isEmpty()) {
+				editPartCollector.add(associatedParts.get(0));
+			} else {
+				if (element.eContainer() != null) {
+					return findElementsInDiagramByID(diagramPart, element.eContainer(), editPartCollector);
+				}
+			}
+		}
+		return editPartCollector.size() - intialNumOfEditParts;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static View findView(DiagramEditPart diagramEditPart, EObject targetElement, LazyElement2ViewMap lazyElement2ViewMap) {
+		boolean hasStructuralURI = false;
+		if (targetElement.eResource() instanceof XMLResource) {
+			hasStructuralURI = ((XMLResource) targetElement.eResource()).getID(targetElement) == null;
+		}
+
+		View view = null;
+		LinkedList<EditPart> editPartHolder = new LinkedList<EditPart>();
+		if (hasStructuralURI && !lazyElement2ViewMap.getElement2ViewMap().isEmpty()) {
+			view = lazyElement2ViewMap.getElement2ViewMap().get(targetElement);
+		} else if (findElementsInDiagramByID(diagramEditPart, targetElement, editPartHolder) > 0) {
+			EditPart editPart = editPartHolder.get(0);
+			view = editPart.getModel() instanceof View ? (View) editPart.getModel() : null;
+		}
+
+		return (view == null) ? diagramEditPart.getDiagramView() : view;
+	}
+
+	/**
+	 * XXX This is quite suspicious code (especially editPartTmpHolder) and likely to be removed soon
+	 * @generated
+	 */
+	public static class LazyElement2ViewMap {
+
+		/**
+		 * @generated
+		 */
+		private Map<EObject, View> element2ViewMap;
+
+		/**
+		 * @generated
+		 */
+		private View scope;
+
+		/**
+		 * @generated
+		 */
+		private Set<? extends EObject> elementSet;
+
+		/**
+		 * @generated
+		 */
+		public LazyElement2ViewMap(View scope, Set<? extends EObject> elements) {
+			this.scope = scope;
+			this.elementSet = elements;
+		}
+
+		/**
+		 * @generated
+		 */
+		public final Map<EObject, View> getElement2ViewMap() {
+			if (element2ViewMap == null) {
+				element2ViewMap = new HashMap<EObject, View>();
+				// map possible notation elements to itself as these can't be found by view.getElement()
+				for (EObject element : elementSet) {
+					if (element instanceof View) {
+						View view = (View) element;
+						if (view.getDiagram() == scope.getDiagram()) {
+							element2ViewMap.put(element, view); // take only those that part of our diagram
+						}
+					}
+				}
+
+				buildElement2ViewMap(scope, element2ViewMap, elementSet);
+			}
+			return element2ViewMap;
+		}
+
+		/**
+		 * @generated
+		 */
+		private static boolean buildElement2ViewMap(View parentView, Map<EObject, View> element2ViewMap, Set<? extends EObject> elements) {
+			if (elements.size() == element2ViewMap.size()) {
+				return true;
+			}
+
+			if (parentView.isSetElement() && !element2ViewMap.containsKey(parentView.getElement()) && elements.contains(parentView.getElement())) {
+				element2ViewMap.put(parentView.getElement(), parentView);
+				if (elements.size() == element2ViewMap.size()) {
+					return true;
+				}
+			}
+			boolean complete = false;
+			for (Iterator<?> it = parentView.getChildren().iterator(); it.hasNext() && !complete;) {
+				complete = buildElement2ViewMap((View) it.next(), element2ViewMap, elements);
+			}
+			for (Iterator<?> it = parentView.getSourceEdges().iterator(); it.hasNext() && !complete;) {
+				complete = buildElement2ViewMap((View) it.next(), element2ViewMap, elements);
+			}
+			for (Iterator<?> it = parentView.getTargetEdges().iterator(); it.hasNext() && !complete;) {
+				complete = buildElement2ViewMap((View) it.next(), element2ViewMap, elements);
+			}
+			return complete;
+		}
+	} //LazyElement2ViewMap	
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramUpdateCommand.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramUpdateCommand.java
new file mode 100644
index 0000000..4ca8a9e
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramUpdateCommand.java
@@ -0,0 +1,78 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.commands.IHandlerListener;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @generated
+ */
+public class LinklfDiagramUpdateCommand implements IHandler {
+
+	/**
+	 * @generated
+	 */
+	public void addHandlerListener(IHandlerListener handlerListener) {
+	}
+
+	/**
+	 * @generated
+	 */
+	public void dispose() {
+	}
+
+	/**
+	 * @generated
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection();
+		if (selection instanceof IStructuredSelection) {
+			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+			if (structuredSelection.size() != 1) {
+				return null;
+			}
+			if (structuredSelection.getFirstElement() instanceof EditPart && ((EditPart) structuredSelection.getFirstElement()).getModel() instanceof View) {
+				EObject modelElement = ((View) ((EditPart) structuredSelection.getFirstElement()).getModel()).getElement();
+				List editPolicies = CanonicalEditPolicy.getRegisteredEditPolicies(modelElement);
+				for (Iterator it = editPolicies.iterator(); it.hasNext();) {
+					CanonicalEditPolicy nextEditPolicy = (CanonicalEditPolicy) it.next();
+					nextEditPolicy.refresh();
+				}
+
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean isEnabled() {
+		return true;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean isHandled() {
+		return true;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void removeHandlerListener(IHandlerListener handlerListener) {
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramUpdater.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramUpdater.java
new file mode 100644
index 0000000..706b7bb
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDiagramUpdater.java
@@ -0,0 +1,811 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.Canvas;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElement;
+import org.eclipse.gmf.tooling.examples.linklf.CanvasElementContainer;
+import org.eclipse.gmf.tooling.examples.linklf.Circle;
+import org.eclipse.gmf.tooling.examples.linklf.Container;
+import org.eclipse.gmf.tooling.examples.linklf.LabeledLink;
+import org.eclipse.gmf.tooling.examples.linklf.Link;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfPackage;
+import org.eclipse.gmf.tooling.examples.linklf.Node;
+import org.eclipse.gmf.tooling.examples.linklf.Port;
+import org.eclipse.gmf.tooling.examples.linklf.Rectangle;
+import org.eclipse.gmf.tooling.examples.linklf.Rhombus;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerContainerCompartment2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerContainerCompartmentEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.runtime.update.DiagramUpdater;
+
+/**
+ * @generated
+ */
+public class LinklfDiagramUpdater {
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfNodeDescriptor> getSemanticChildren(View view) {
+		switch (LinklfVisualIDRegistry.getVisualID(view)) {
+		case CanvasEditPart.VISUAL_ID:
+			return getCanvas_1000SemanticChildren(view);
+		case ContainerEditPart.VISUAL_ID:
+			return getContainer_2003SemanticChildren(view);
+		case Container2EditPart.VISUAL_ID:
+			return getContainer_3002SemanticChildren(view);
+		case ContainerContainerCompartmentEditPart.VISUAL_ID:
+			return getContainerContainerCompartment_7001SemanticChildren(view);
+		case ContainerContainerCompartment2EditPart.VISUAL_ID:
+			return getContainerContainerCompartment_7002SemanticChildren(view);
+		}
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfNodeDescriptor> getCanvas_1000SemanticChildren(View view) {
+		if (!view.isSetElement()) {
+			return Collections.emptyList();
+		}
+		Canvas modelElement = (Canvas) view.getElement();
+		LinkedList<LinklfNodeDescriptor> result = new LinkedList<LinklfNodeDescriptor>();
+		for (Iterator<?> it = modelElement.getElements().iterator(); it.hasNext();) {
+			CanvasElement childElement = (CanvasElement) it.next();
+			int visualID = LinklfVisualIDRegistry.getNodeVisualID(view, childElement);
+			if (visualID == CircleEditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+			if (visualID == RectangleEditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+			if (visualID == ContainerEditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+			if (visualID == RhombusEditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfNodeDescriptor> getContainer_2003SemanticChildren(View view) {
+		if (!view.isSetElement()) {
+			return Collections.emptyList();
+		}
+		Container modelElement = (Container) view.getElement();
+		LinkedList<LinklfNodeDescriptor> result = new LinkedList<LinklfNodeDescriptor>();
+		for (Iterator<?> it = modelElement.getPorst().iterator(); it.hasNext();) {
+			Port childElement = (Port) it.next();
+			int visualID = LinklfVisualIDRegistry.getNodeVisualID(view, childElement);
+			if (visualID == PortEditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfNodeDescriptor> getContainer_3002SemanticChildren(View view) {
+		if (!view.isSetElement()) {
+			return Collections.emptyList();
+		}
+		Container modelElement = (Container) view.getElement();
+		LinkedList<LinklfNodeDescriptor> result = new LinkedList<LinklfNodeDescriptor>();
+		for (Iterator<?> it = modelElement.getPorst().iterator(); it.hasNext();) {
+			Port childElement = (Port) it.next();
+			int visualID = LinklfVisualIDRegistry.getNodeVisualID(view, childElement);
+			if (visualID == PortEditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfNodeDescriptor> getContainerContainerCompartment_7001SemanticChildren(View view) {
+		if (false == view.eContainer() instanceof View) {
+			return Collections.emptyList();
+		}
+		View containerView = (View) view.eContainer();
+		if (!containerView.isSetElement()) {
+			return Collections.emptyList();
+		}
+		Container modelElement = (Container) containerView.getElement();
+		LinkedList<LinklfNodeDescriptor> result = new LinkedList<LinklfNodeDescriptor>();
+		for (Iterator<?> it = modelElement.getElements().iterator(); it.hasNext();) {
+			CanvasElement childElement = (CanvasElement) it.next();
+			int visualID = LinklfVisualIDRegistry.getNodeVisualID(view, childElement);
+			if (visualID == Circle2EditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+			if (visualID == Container2EditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+			if (visualID == Rectangle2EditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+			if (visualID == Rhombus2EditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfNodeDescriptor> getContainerContainerCompartment_7002SemanticChildren(View view) {
+		if (false == view.eContainer() instanceof View) {
+			return Collections.emptyList();
+		}
+		View containerView = (View) view.eContainer();
+		if (!containerView.isSetElement()) {
+			return Collections.emptyList();
+		}
+		Container modelElement = (Container) containerView.getElement();
+		LinkedList<LinklfNodeDescriptor> result = new LinkedList<LinklfNodeDescriptor>();
+		for (Iterator<?> it = modelElement.getElements().iterator(); it.hasNext();) {
+			CanvasElement childElement = (CanvasElement) it.next();
+			int visualID = LinklfVisualIDRegistry.getNodeVisualID(view, childElement);
+			if (visualID == Circle2EditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+			if (visualID == Container2EditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+			if (visualID == Rectangle2EditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+			if (visualID == Rhombus2EditPart.VISUAL_ID) {
+				result.add(new LinklfNodeDescriptor(childElement, visualID));
+				continue;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getContainedLinks(View view) {
+		switch (LinklfVisualIDRegistry.getVisualID(view)) {
+		case CanvasEditPart.VISUAL_ID:
+			return getCanvas_1000ContainedLinks(view);
+		case CircleEditPart.VISUAL_ID:
+			return getCircle_2001ContainedLinks(view);
+		case RectangleEditPart.VISUAL_ID:
+			return getRectangle_2002ContainedLinks(view);
+		case ContainerEditPart.VISUAL_ID:
+			return getContainer_2003ContainedLinks(view);
+		case RhombusEditPart.VISUAL_ID:
+			return getRhombus_2004ContainedLinks(view);
+		case Circle2EditPart.VISUAL_ID:
+			return getCircle_3001ContainedLinks(view);
+		case Container2EditPart.VISUAL_ID:
+			return getContainer_3002ContainedLinks(view);
+		case Rectangle2EditPart.VISUAL_ID:
+			return getRectangle_3003ContainedLinks(view);
+		case Rhombus2EditPart.VISUAL_ID:
+			return getRhombus_3004ContainedLinks(view);
+		case PortEditPart.VISUAL_ID:
+			return getPort_3005ContainedLinks(view);
+		case LinkEditPart.VISUAL_ID:
+			return getLink_4001ContainedLinks(view);
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getLabeledLink_4002ContainedLinks(view);
+		}
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getIncomingLinks(View view) {
+		switch (LinklfVisualIDRegistry.getVisualID(view)) {
+		case CircleEditPart.VISUAL_ID:
+			return getCircle_2001IncomingLinks(view);
+		case RectangleEditPart.VISUAL_ID:
+			return getRectangle_2002IncomingLinks(view);
+		case ContainerEditPart.VISUAL_ID:
+			return getContainer_2003IncomingLinks(view);
+		case RhombusEditPart.VISUAL_ID:
+			return getRhombus_2004IncomingLinks(view);
+		case Circle2EditPart.VISUAL_ID:
+			return getCircle_3001IncomingLinks(view);
+		case Container2EditPart.VISUAL_ID:
+			return getContainer_3002IncomingLinks(view);
+		case Rectangle2EditPart.VISUAL_ID:
+			return getRectangle_3003IncomingLinks(view);
+		case Rhombus2EditPart.VISUAL_ID:
+			return getRhombus_3004IncomingLinks(view);
+		case PortEditPart.VISUAL_ID:
+			return getPort_3005IncomingLinks(view);
+		case LinkEditPart.VISUAL_ID:
+			return getLink_4001IncomingLinks(view);
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getLabeledLink_4002IncomingLinks(view);
+		}
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getOutgoingLinks(View view) {
+		switch (LinklfVisualIDRegistry.getVisualID(view)) {
+		case CircleEditPart.VISUAL_ID:
+			return getCircle_2001OutgoingLinks(view);
+		case RectangleEditPart.VISUAL_ID:
+			return getRectangle_2002OutgoingLinks(view);
+		case ContainerEditPart.VISUAL_ID:
+			return getContainer_2003OutgoingLinks(view);
+		case RhombusEditPart.VISUAL_ID:
+			return getRhombus_2004OutgoingLinks(view);
+		case Circle2EditPart.VISUAL_ID:
+			return getCircle_3001OutgoingLinks(view);
+		case Container2EditPart.VISUAL_ID:
+			return getContainer_3002OutgoingLinks(view);
+		case Rectangle2EditPart.VISUAL_ID:
+			return getRectangle_3003OutgoingLinks(view);
+		case Rhombus2EditPart.VISUAL_ID:
+			return getRhombus_3004OutgoingLinks(view);
+		case PortEditPart.VISUAL_ID:
+			return getPort_3005OutgoingLinks(view);
+		case LinkEditPart.VISUAL_ID:
+			return getLink_4001OutgoingLinks(view);
+		case LabeledLinkEditPart.VISUAL_ID:
+			return getLabeledLink_4002OutgoingLinks(view);
+		}
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getCanvas_1000ContainedLinks(View view) {
+		Canvas modelElement = (Canvas) view.getElement();
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getContainedTypeModelFacetLinks_Link_4001(modelElement));
+		result.addAll(getContainedTypeModelFacetLinks_LabeledLink_4002(modelElement));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getCircle_2001ContainedLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRectangle_2002ContainedLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getContainer_2003ContainedLinks(View view) {
+		Container modelElement = (Container) view.getElement();
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getContainedTypeModelFacetLinks_Link_4001(modelElement));
+		result.addAll(getContainedTypeModelFacetLinks_LabeledLink_4002(modelElement));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRhombus_2004ContainedLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getCircle_3001ContainedLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getContainer_3002ContainedLinks(View view) {
+		Container modelElement = (Container) view.getElement();
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getContainedTypeModelFacetLinks_Link_4001(modelElement));
+		result.addAll(getContainedTypeModelFacetLinks_LabeledLink_4002(modelElement));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRectangle_3003ContainedLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRhombus_3004ContainedLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getPort_3005ContainedLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getLink_4001ContainedLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getLabeledLink_4002ContainedLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getCircle_2001IncomingLinks(View view) {
+		Circle modelElement = (Circle) view.getElement();
+		Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer.find(view.eResource().getResourceSet().getResources());
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getIncomingTypeModelFacetLinks_Link_4001(modelElement, crossReferences));
+		result.addAll(getIncomingTypeModelFacetLinks_LabeledLink_4002(modelElement, crossReferences));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRectangle_2002IncomingLinks(View view) {
+		Rectangle modelElement = (Rectangle) view.getElement();
+		Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer.find(view.eResource().getResourceSet().getResources());
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getIncomingTypeModelFacetLinks_Link_4001(modelElement, crossReferences));
+		result.addAll(getIncomingTypeModelFacetLinks_LabeledLink_4002(modelElement, crossReferences));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getContainer_2003IncomingLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRhombus_2004IncomingLinks(View view) {
+		Rhombus modelElement = (Rhombus) view.getElement();
+		Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer.find(view.eResource().getResourceSet().getResources());
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getIncomingTypeModelFacetLinks_Link_4001(modelElement, crossReferences));
+		result.addAll(getIncomingTypeModelFacetLinks_LabeledLink_4002(modelElement, crossReferences));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getCircle_3001IncomingLinks(View view) {
+		Circle modelElement = (Circle) view.getElement();
+		Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer.find(view.eResource().getResourceSet().getResources());
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getIncomingTypeModelFacetLinks_Link_4001(modelElement, crossReferences));
+		result.addAll(getIncomingTypeModelFacetLinks_LabeledLink_4002(modelElement, crossReferences));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getContainer_3002IncomingLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRectangle_3003IncomingLinks(View view) {
+		Rectangle modelElement = (Rectangle) view.getElement();
+		Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer.find(view.eResource().getResourceSet().getResources());
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getIncomingTypeModelFacetLinks_Link_4001(modelElement, crossReferences));
+		result.addAll(getIncomingTypeModelFacetLinks_LabeledLink_4002(modelElement, crossReferences));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRhombus_3004IncomingLinks(View view) {
+		Rhombus modelElement = (Rhombus) view.getElement();
+		Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer.find(view.eResource().getResourceSet().getResources());
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getIncomingTypeModelFacetLinks_Link_4001(modelElement, crossReferences));
+		result.addAll(getIncomingTypeModelFacetLinks_LabeledLink_4002(modelElement, crossReferences));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getPort_3005IncomingLinks(View view) {
+		Port modelElement = (Port) view.getElement();
+		Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer.find(view.eResource().getResourceSet().getResources());
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getIncomingTypeModelFacetLinks_Link_4001(modelElement, crossReferences));
+		result.addAll(getIncomingTypeModelFacetLinks_LabeledLink_4002(modelElement, crossReferences));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getLink_4001IncomingLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getLabeledLink_4002IncomingLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getCircle_2001OutgoingLinks(View view) {
+		Circle modelElement = (Circle) view.getElement();
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getOutgoingTypeModelFacetLinks_Link_4001(modelElement));
+		result.addAll(getOutgoingTypeModelFacetLinks_LabeledLink_4002(modelElement));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRectangle_2002OutgoingLinks(View view) {
+		Rectangle modelElement = (Rectangle) view.getElement();
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getOutgoingTypeModelFacetLinks_Link_4001(modelElement));
+		result.addAll(getOutgoingTypeModelFacetLinks_LabeledLink_4002(modelElement));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getContainer_2003OutgoingLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRhombus_2004OutgoingLinks(View view) {
+		Rhombus modelElement = (Rhombus) view.getElement();
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getOutgoingTypeModelFacetLinks_Link_4001(modelElement));
+		result.addAll(getOutgoingTypeModelFacetLinks_LabeledLink_4002(modelElement));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getCircle_3001OutgoingLinks(View view) {
+		Circle modelElement = (Circle) view.getElement();
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getOutgoingTypeModelFacetLinks_Link_4001(modelElement));
+		result.addAll(getOutgoingTypeModelFacetLinks_LabeledLink_4002(modelElement));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getContainer_3002OutgoingLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRectangle_3003OutgoingLinks(View view) {
+		Rectangle modelElement = (Rectangle) view.getElement();
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getOutgoingTypeModelFacetLinks_Link_4001(modelElement));
+		result.addAll(getOutgoingTypeModelFacetLinks_LabeledLink_4002(modelElement));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getRhombus_3004OutgoingLinks(View view) {
+		Rhombus modelElement = (Rhombus) view.getElement();
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getOutgoingTypeModelFacetLinks_Link_4001(modelElement));
+		result.addAll(getOutgoingTypeModelFacetLinks_LabeledLink_4002(modelElement));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getPort_3005OutgoingLinks(View view) {
+		Port modelElement = (Port) view.getElement();
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		result.addAll(getOutgoingTypeModelFacetLinks_Link_4001(modelElement));
+		result.addAll(getOutgoingTypeModelFacetLinks_LabeledLink_4002(modelElement));
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getLink_4001OutgoingLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	public static List<LinklfLinkDescriptor> getLabeledLink_4002OutgoingLinks(View view) {
+		return Collections.emptyList();
+	}
+
+	/**
+	 * @generated
+	 */
+	private static Collection<LinklfLinkDescriptor> getContainedTypeModelFacetLinks_Link_4001(CanvasElementContainer container) {
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		for (Iterator<?> links = container.getElements().iterator(); links.hasNext();) {
+			EObject linkObject = (EObject) links.next();
+			if (false == linkObject instanceof Link) {
+				continue;
+			}
+			Link link = (Link) linkObject;
+			if (LinkEditPart.VISUAL_ID != LinklfVisualIDRegistry.getLinkWithClassVisualID(link)) {
+				continue;
+			}
+			Node dst = link.getTarget();
+			Node src = link.getSource();
+			result.add(new LinklfLinkDescriptor(src, dst, link, LinklfElementTypes.Link_4001, LinkEditPart.VISUAL_ID));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private static Collection<LinklfLinkDescriptor> getContainedTypeModelFacetLinks_LabeledLink_4002(CanvasElementContainer container) {
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		for (Iterator<?> links = container.getElements().iterator(); links.hasNext();) {
+			EObject linkObject = (EObject) links.next();
+			if (false == linkObject instanceof LabeledLink) {
+				continue;
+			}
+			LabeledLink link = (LabeledLink) linkObject;
+			if (LabeledLinkEditPart.VISUAL_ID != LinklfVisualIDRegistry.getLinkWithClassVisualID(link)) {
+				continue;
+			}
+			Node dst = link.getTarget();
+			Node src = link.getSource();
+			result.add(new LinklfLinkDescriptor(src, dst, link, LinklfElementTypes.LabeledLink_4002, LabeledLinkEditPart.VISUAL_ID));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private static Collection<LinklfLinkDescriptor> getIncomingTypeModelFacetLinks_Link_4001(Node target, Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences) {
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		Collection<EStructuralFeature.Setting> settings = crossReferences.get(target);
+		for (EStructuralFeature.Setting setting : settings) {
+			if (setting.getEStructuralFeature() != LinklfPackage.eINSTANCE.getLink_Target() || false == setting.getEObject() instanceof Link) {
+				continue;
+			}
+			Link link = (Link) setting.getEObject();
+			if (LinkEditPart.VISUAL_ID != LinklfVisualIDRegistry.getLinkWithClassVisualID(link)) {
+				continue;
+			}
+			Node src = link.getSource();
+			result.add(new LinklfLinkDescriptor(src, target, link, LinklfElementTypes.Link_4001, LinkEditPart.VISUAL_ID));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private static Collection<LinklfLinkDescriptor> getIncomingTypeModelFacetLinks_LabeledLink_4002(Node target, Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences) {
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		Collection<EStructuralFeature.Setting> settings = crossReferences.get(target);
+		for (EStructuralFeature.Setting setting : settings) {
+			if (setting.getEStructuralFeature() != LinklfPackage.eINSTANCE.getLabeledLink_Target() || false == setting.getEObject() instanceof LabeledLink) {
+				continue;
+			}
+			LabeledLink link = (LabeledLink) setting.getEObject();
+			if (LabeledLinkEditPart.VISUAL_ID != LinklfVisualIDRegistry.getLinkWithClassVisualID(link)) {
+				continue;
+			}
+			Node src = link.getSource();
+			result.add(new LinklfLinkDescriptor(src, target, link, LinklfElementTypes.LabeledLink_4002, LabeledLinkEditPart.VISUAL_ID));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private static Collection<LinklfLinkDescriptor> getOutgoingTypeModelFacetLinks_Link_4001(Node source) {
+		CanvasElementContainer container = null;
+		// Find container element for the link.
+		// Climb up by containment hierarchy starting from the source
+		// and return the first element that is instance of the container class.
+		for (EObject element = source; element != null && container == null; element = element.eContainer()) {
+			if (element instanceof CanvasElementContainer) {
+				container = (CanvasElementContainer) element;
+			}
+		}
+		if (container == null) {
+			return Collections.emptyList();
+		}
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		for (Iterator<?> links = container.getElements().iterator(); links.hasNext();) {
+			EObject linkObject = (EObject) links.next();
+			if (false == linkObject instanceof Link) {
+				continue;
+			}
+			Link link = (Link) linkObject;
+			if (LinkEditPart.VISUAL_ID != LinklfVisualIDRegistry.getLinkWithClassVisualID(link)) {
+				continue;
+			}
+			Node dst = link.getTarget();
+			Node src = link.getSource();
+			if (src != source) {
+				continue;
+			}
+			result.add(new LinklfLinkDescriptor(src, dst, link, LinklfElementTypes.Link_4001, LinkEditPart.VISUAL_ID));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	private static Collection<LinklfLinkDescriptor> getOutgoingTypeModelFacetLinks_LabeledLink_4002(Node source) {
+		CanvasElementContainer container = null;
+		// Find container element for the link.
+		// Climb up by containment hierarchy starting from the source
+		// and return the first element that is instance of the container class.
+		for (EObject element = source; element != null && container == null; element = element.eContainer()) {
+			if (element instanceof CanvasElementContainer) {
+				container = (CanvasElementContainer) element;
+			}
+		}
+		if (container == null) {
+			return Collections.emptyList();
+		}
+		LinkedList<LinklfLinkDescriptor> result = new LinkedList<LinklfLinkDescriptor>();
+		for (Iterator<?> links = container.getElements().iterator(); links.hasNext();) {
+			EObject linkObject = (EObject) links.next();
+			if (false == linkObject instanceof LabeledLink) {
+				continue;
+			}
+			LabeledLink link = (LabeledLink) linkObject;
+			if (LabeledLinkEditPart.VISUAL_ID != LinklfVisualIDRegistry.getLinkWithClassVisualID(link)) {
+				continue;
+			}
+			Node dst = link.getTarget();
+			Node src = link.getSource();
+			if (src != source) {
+				continue;
+			}
+			result.add(new LinklfLinkDescriptor(src, dst, link, LinklfElementTypes.LabeledLink_4002, LabeledLinkEditPart.VISUAL_ID));
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static final DiagramUpdater TYPED_INSTANCE = new DiagramUpdater() {
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public List<LinklfNodeDescriptor> getSemanticChildren(View view) {
+			return LinklfDiagramUpdater.getSemanticChildren(view);
+		}
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public List<LinklfLinkDescriptor> getContainedLinks(View view) {
+			return LinklfDiagramUpdater.getContainedLinks(view);
+		}
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public List<LinklfLinkDescriptor> getIncomingLinks(View view) {
+			return LinklfDiagramUpdater.getIncomingLinks(view);
+		}
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public List<LinklfLinkDescriptor> getOutgoingLinks(View view) {
+			return LinklfDiagramUpdater.getOutgoingLinks(view);
+		}
+	};
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDocumentProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDocumentProvider.java
new file mode 100644
index 0000000..b01dc05
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfDocumentProvider.java
@@ -0,0 +1,981 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceStatus;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.core.runtime.jobs.MultiRule;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.ui.URIEditorInput;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.transaction.NotificationFilter;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.AbstractDocumentProvider;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocumentProvider;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.EditorStatusCodes;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.util.DiagramIOUtil;
+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * @generated
+ */
+public class LinklfDocumentProvider extends AbstractDocumentProvider implements IDiagramDocumentProvider {
+
+	/**
+	 * @generated
+	 */
+	protected ElementInfo createElementInfo(Object element) throws CoreException {
+		if (false == element instanceof FileEditorInput && false == element instanceof URIEditorInput) {
+			throw new CoreException(new Status(IStatus.ERROR, LinklfDiagramEditorPlugin.ID, 0,
+					NLS.bind(Messages.LinklfDocumentProvider_IncorrectInputError, new Object[] { element, "org.eclipse.ui.part.FileEditorInput", "org.eclipse.emf.common.ui.URIEditorInput" }), //$NON-NLS-1$ //$NON-NLS-2$ 
+					null));
+		}
+		IEditorInput editorInput = (IEditorInput) element;
+		IDiagramDocument document = (IDiagramDocument) createDocument(editorInput);
+
+		ResourceSetInfo info = new ResourceSetInfo(document, editorInput);
+		info.setModificationStamp(computeModificationStamp(info));
+		info.fStatus = null;
+		return info;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IDocument createDocument(Object element) throws CoreException {
+		if (false == element instanceof FileEditorInput && false == element instanceof URIEditorInput) {
+			throw new CoreException(new Status(IStatus.ERROR, LinklfDiagramEditorPlugin.ID, 0,
+					NLS.bind(Messages.LinklfDocumentProvider_IncorrectInputError, new Object[] { element, "org.eclipse.ui.part.FileEditorInput", "org.eclipse.emf.common.ui.URIEditorInput" }), //$NON-NLS-1$ //$NON-NLS-2$ 
+					null));
+		}
+		IDocument document = createEmptyDocument();
+		setDocumentContent(document, (IEditorInput) element);
+		setupDocument(element, document);
+		return document;
+	}
+
+	/**
+	 * Sets up the given document as it would be provided for the given element. The
+	 * content of the document is not changed. This default implementation is empty.
+	 * Subclasses may reimplement.
+	 * 
+	 * @param element the blue-print element
+	 * @param document the document to set up
+	 * @generated
+	 */
+	protected void setupDocument(Object element, IDocument document) {
+		// for subclasses
+	}
+
+	/**
+	 * @generated
+	 */
+	private long computeModificationStamp(ResourceSetInfo info) {
+		int result = 0;
+		for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it.hasNext();) {
+			Resource nextResource = it.next();
+			IFile file = WorkspaceSynchronizer.getFile(nextResource);
+			if (file != null) {
+				if (file.getLocation() != null) {
+					result += file.getLocation().toFile().lastModified();
+				} else {
+					result += file.getModificationStamp();
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IDocument createEmptyDocument() {
+		DiagramDocument document = new DiagramDocument();
+		document.setEditingDomain(createEditingDomain());
+		return document;
+	}
+
+	/**
+	 * @generated
+	 */
+	private TransactionalEditingDomain createEditingDomain() {
+		TransactionalEditingDomain editingDomain = DiagramEditingDomainFactory.getInstance().createEditingDomain();
+		editingDomain.setID("org.eclipse.gmf.tooling.examples.linklf.diagram.EditingDomain"); //$NON-NLS-1$
+		final NotificationFilter diagramResourceModifiedFilter = NotificationFilter.createNotifierFilter(editingDomain.getResourceSet()).and(NotificationFilter.createEventTypeFilter(Notification.ADD))
+				.and(NotificationFilter.createFeatureFilter(ResourceSet.class, ResourceSet.RESOURCE_SET__RESOURCES));
+		editingDomain.getResourceSet().eAdapters().add(new Adapter() {
+
+			private Notifier myTarger;
+
+			public Notifier getTarget() {
+				return myTarger;
+			}
+
+			public boolean isAdapterForType(Object type) {
+				return false;
+			}
+
+			public void notifyChanged(Notification notification) {
+				if (diagramResourceModifiedFilter.matches(notification)) {
+					Object value = notification.getNewValue();
+					if (value instanceof Resource) {
+						((Resource) value).setTrackingModification(true);
+					}
+				}
+			}
+
+			public void setTarget(Notifier newTarget) {
+				myTarger = newTarget;
+			}
+
+		});
+
+		return editingDomain;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void setDocumentContent(IDocument document, IEditorInput element) throws CoreException {
+		IDiagramDocument diagramDocument = (IDiagramDocument) document;
+		TransactionalEditingDomain domain = diagramDocument.getEditingDomain();
+		if (element instanceof FileEditorInput) {
+			IStorage storage = ((FileEditorInput) element).getStorage();
+			Diagram diagram = DiagramIOUtil.load(domain, storage, true, getProgressMonitor());
+			document.setContent(diagram);
+		} else if (element instanceof URIEditorInput) {
+			URI uri = ((URIEditorInput) element).getURI();
+			Resource resource = null;
+			try {
+				resource = domain.getResourceSet().getResource(uri.trimFragment(), false);
+				if (resource == null) {
+					resource = domain.getResourceSet().createResource(uri.trimFragment());
+				}
+				if (!resource.isLoaded()) {
+					try {
+						Map options = new HashMap(GMFResourceFactory.getDefaultLoadOptions());
+						// @see 171060 
+						// options.put(org.eclipse.emf.ecore.xmi.XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
+						resource.load(options);
+					} catch (IOException e) {
+						resource.unload();
+						throw e;
+					}
+				}
+				if (uri.fragment() != null) {
+					EObject rootElement = resource.getEObject(uri.fragment());
+					if (rootElement instanceof Diagram) {
+						document.setContent((Diagram) rootElement);
+						return;
+					}
+				} else {
+					for (Iterator it = resource.getContents().iterator(); it.hasNext();) {
+						Object rootElement = it.next();
+						if (rootElement instanceof Diagram) {
+							document.setContent((Diagram) rootElement);
+							return;
+						}
+					}
+				}
+				throw new RuntimeException(Messages.LinklfDocumentProvider_NoDiagramInResourceError);
+			} catch (Exception e) {
+				CoreException thrownExcp = null;
+				if (e instanceof CoreException) {
+					thrownExcp = (CoreException) e;
+				} else {
+					String msg = e.getLocalizedMessage();
+					thrownExcp = new CoreException(new Status(IStatus.ERROR, LinklfDiagramEditorPlugin.ID, 0, msg != null ? msg : Messages.LinklfDocumentProvider_DiagramLoadingError, e));
+				}
+				throw thrownExcp;
+			}
+		} else {
+			throw new CoreException(new Status(IStatus.ERROR, LinklfDiagramEditorPlugin.ID, 0,
+					NLS.bind(Messages.LinklfDocumentProvider_IncorrectInputError, new Object[] { element, "org.eclipse.ui.part.FileEditorInput", "org.eclipse.emf.common.ui.URIEditorInput" }), //$NON-NLS-1$ //$NON-NLS-2$ 
+					null));
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	public long getModificationStamp(Object element) {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			return computeModificationStamp(info);
+		}
+		return super.getModificationStamp(element);
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean isDeleted(Object element) {
+		IDiagramDocument document = getDiagramDocument(element);
+		if (document != null) {
+			Resource diagramResource = document.getDiagram().eResource();
+			if (diagramResource != null) {
+				IFile file = WorkspaceSynchronizer.getFile(diagramResource);
+				return file == null || file.getLocation() == null || !file.getLocation().toFile().exists();
+			}
+		}
+		return super.isDeleted(element);
+	}
+
+	/**
+	 * @generated
+	 */
+	public ResourceSetInfo getResourceSetInfo(Object editorInput) {
+		return (ResourceSetInfo) super.getElementInfo(editorInput);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void disposeElementInfo(Object element, ElementInfo info) {
+		if (info instanceof ResourceSetInfo) {
+			ResourceSetInfo resourceSetInfo = (ResourceSetInfo) info;
+			resourceSetInfo.dispose();
+		}
+		super.disposeElementInfo(element, info);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doValidateState(Object element, Object computationContext) throws CoreException {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			LinkedList<IFile> files2Validate = new LinkedList<IFile>();
+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it.hasNext();) {
+				Resource nextResource = it.next();
+				IFile file = WorkspaceSynchronizer.getFile(nextResource);
+				if (file != null && file.isReadOnly()) {
+					files2Validate.add(file);
+				}
+			}
+			ResourcesPlugin.getWorkspace().validateEdit((IFile[]) files2Validate.toArray(new IFile[files2Validate.size()]), computationContext);
+		}
+
+		super.doValidateState(element, computationContext);
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean isReadOnly(Object element) {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			if (info.isUpdateCache()) {
+				try {
+					updateCache(element);
+				} catch (CoreException ex) {
+					LinklfDiagramEditorPlugin.getInstance().logError(Messages.LinklfDocumentProvider_isModifiable, ex);
+					// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.StorageDocumentProvider_isModifiable
+				}
+			}
+			return info.isReadOnly();
+		}
+		return super.isReadOnly(element);
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean isModifiable(Object element) {
+		if (!isStateValidated(element)) {
+			if (element instanceof FileEditorInput || element instanceof URIEditorInput) {
+				return true;
+			}
+		}
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			if (info.isUpdateCache()) {
+				try {
+					updateCache(element);
+				} catch (CoreException ex) {
+					LinklfDiagramEditorPlugin.getInstance().logError(Messages.LinklfDocumentProvider_isModifiable, ex);
+					// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.StorageDocumentProvider_isModifiable
+				}
+			}
+			return info.isModifiable();
+		}
+		return super.isModifiable(element);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void updateCache(Object element) throws CoreException {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it.hasNext();) {
+				Resource nextResource = it.next();
+				IFile file = WorkspaceSynchronizer.getFile(nextResource);
+				if (file != null && file.isReadOnly()) {
+					info.setReadOnly(true);
+					info.setModifiable(false);
+					return;
+				}
+			}
+			info.setReadOnly(false);
+			info.setModifiable(true);
+			return;
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doUpdateStateCache(Object element) throws CoreException {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			info.setUpdateCache(true);
+		}
+		super.doUpdateStateCache(element);
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean isSynchronized(Object element) {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			return info.isSynchronized();
+		}
+		return super.isSynchronized(element);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected ISchedulingRule getResetRule(Object element) {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			LinkedList<ISchedulingRule> rules = new LinkedList<ISchedulingRule>();
+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it.hasNext();) {
+				Resource nextResource = it.next();
+				IFile file = WorkspaceSynchronizer.getFile(nextResource);
+				if (file != null) {
+					rules.add(ResourcesPlugin.getWorkspace().getRuleFactory().modifyRule(file));
+				}
+			}
+			return new MultiRule((ISchedulingRule[]) rules.toArray(new ISchedulingRule[rules.size()]));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected ISchedulingRule getSaveRule(Object element) {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			LinkedList<ISchedulingRule> rules = new LinkedList<ISchedulingRule>();
+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it.hasNext();) {
+				Resource nextResource = it.next();
+				IFile file = WorkspaceSynchronizer.getFile(nextResource);
+				if (file != null) {
+					rules.add(computeSchedulingRule(file));
+				}
+			}
+			return new MultiRule((ISchedulingRule[]) rules.toArray(new ISchedulingRule[rules.size()]));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected ISchedulingRule getSynchronizeRule(Object element) {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			LinkedList<ISchedulingRule> rules = new LinkedList<ISchedulingRule>();
+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it.hasNext();) {
+				Resource nextResource = it.next();
+				IFile file = WorkspaceSynchronizer.getFile(nextResource);
+				if (file != null) {
+					rules.add(ResourcesPlugin.getWorkspace().getRuleFactory().refreshRule(file));
+				}
+			}
+			return new MultiRule((ISchedulingRule[]) rules.toArray(new ISchedulingRule[rules.size()]));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected ISchedulingRule getValidateStateRule(Object element) {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			LinkedList<ISchedulingRule> files = new LinkedList<ISchedulingRule>();
+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it.hasNext();) {
+				Resource nextResource = it.next();
+				IFile file = WorkspaceSynchronizer.getFile(nextResource);
+				if (file != null) {
+					files.add(file);
+				}
+			}
+			return ResourcesPlugin.getWorkspace().getRuleFactory().validateEditRule((IFile[]) files.toArray(new IFile[files.size()]));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	private ISchedulingRule computeSchedulingRule(IResource toCreateOrModify) {
+		if (toCreateOrModify.exists())
+			return ResourcesPlugin.getWorkspace().getRuleFactory().modifyRule(toCreateOrModify);
+
+		IResource parent = toCreateOrModify;
+		do {
+			/*
+			 * XXX This is a workaround for
+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=67601
+			 * IResourceRuleFactory.createRule should iterate the hierarchy
+			 * itself.
+			 */
+			toCreateOrModify = parent;
+			parent = toCreateOrModify.getParent();
+		} while (parent != null && !parent.exists());
+
+		return ResourcesPlugin.getWorkspace().getRuleFactory().createRule(toCreateOrModify);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doSynchronize(Object element, IProgressMonitor monitor) throws CoreException {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it.hasNext();) {
+				Resource nextResource = it.next();
+				handleElementChanged(info, nextResource, monitor);
+			}
+			return;
+		}
+		super.doSynchronize(element, monitor);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) throws CoreException {
+		ResourceSetInfo info = getResourceSetInfo(element);
+		if (info != null) {
+			if (!overwrite && !info.isSynchronized()) {
+				throw new CoreException(new Status(IStatus.ERROR, LinklfDiagramEditorPlugin.ID, IResourceStatus.OUT_OF_SYNC_LOCAL, Messages.LinklfDocumentProvider_UnsynchronizedFileSaveError, null));
+			}
+			info.stopResourceListening();
+			fireElementStateChanging(element);
+			try {
+				monitor.beginTask(Messages.LinklfDocumentProvider_SaveDiagramTask, info.getResourceSet().getResources().size() + 1); //"Saving diagram"
+				for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it.hasNext();) {
+					Resource nextResource = it.next();
+					monitor.setTaskName(NLS.bind(Messages.LinklfDocumentProvider_SaveNextResourceTask, nextResource.getURI()));
+					if (nextResource.isLoaded() && !info.getEditingDomain().isReadOnly(nextResource)) {
+						try {
+							nextResource.save(LinklfDiagramEditorUtil.getSaveOptions());
+						} catch (IOException e) {
+							fireElementStateChangeFailed(element);
+							throw new CoreException(new Status(IStatus.ERROR, LinklfDiagramEditorPlugin.ID, EditorStatusCodes.RESOURCE_FAILURE, e.getLocalizedMessage(), null));
+						}
+					}
+					monitor.worked(1);
+				}
+				monitor.done();
+				info.setModificationStamp(computeModificationStamp(info));
+			} catch (RuntimeException x) {
+				fireElementStateChangeFailed(element);
+				throw x;
+			} finally {
+				info.startResourceListening();
+			}
+		} else {
+			URI newResoruceURI;
+			List<IFile> affectedFiles = null;
+			if (element instanceof FileEditorInput) {
+				IFile newFile = ((FileEditorInput) element).getFile();
+				affectedFiles = Collections.singletonList(newFile);
+				newResoruceURI = URI.createPlatformResourceURI(newFile.getFullPath().toString(), true);
+			} else if (element instanceof URIEditorInput) {
+				newResoruceURI = ((URIEditorInput) element).getURI();
+			} else {
+				fireElementStateChangeFailed(element);
+				throw new CoreException(new Status(IStatus.ERROR, LinklfDiagramEditorPlugin.ID, 0,
+						NLS.bind(Messages.LinklfDocumentProvider_IncorrectInputError, new Object[] { element, "org.eclipse.ui.part.FileEditorInput", "org.eclipse.emf.common.ui.URIEditorInput" }), //$NON-NLS-1$ //$NON-NLS-2$ 
+						null));
+			}
+			if (false == document instanceof IDiagramDocument) {
+				fireElementStateChangeFailed(element);
+				throw new CoreException(new Status(IStatus.ERROR, LinklfDiagramEditorPlugin.ID, 0,
+						"Incorrect document used: " + document + " instead of org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument", null)); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			IDiagramDocument diagramDocument = (IDiagramDocument) document;
+			final Resource newResource = diagramDocument.getEditingDomain().getResourceSet().createResource(newResoruceURI);
+			final Diagram diagramCopy = (Diagram) EcoreUtil.copy(diagramDocument.getDiagram());
+			try {
+				new AbstractTransactionalCommand(diagramDocument.getEditingDomain(), NLS.bind(Messages.LinklfDocumentProvider_SaveAsOperation, diagramCopy.getName()), affectedFiles) {
+
+					protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+						newResource.getContents().add(diagramCopy);
+						return CommandResult.newOKCommandResult();
+					}
+				}.execute(monitor, null);
+				newResource.save(LinklfDiagramEditorUtil.getSaveOptions());
+			} catch (ExecutionException e) {
+				fireElementStateChangeFailed(element);
+				throw new CoreException(new Status(IStatus.ERROR, LinklfDiagramEditorPlugin.ID, 0, e.getLocalizedMessage(), null));
+			} catch (IOException e) {
+				fireElementStateChangeFailed(element);
+				throw new CoreException(new Status(IStatus.ERROR, LinklfDiagramEditorPlugin.ID, 0, e.getLocalizedMessage(), null));
+			}
+			newResource.unload();
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void handleElementChanged(ResourceSetInfo info, Resource changedResource, IProgressMonitor monitor) {
+		IFile file = WorkspaceSynchronizer.getFile(changedResource);
+		if (file != null) {
+			try {
+				file.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+			} catch (CoreException ex) {
+				LinklfDiagramEditorPlugin.getInstance().logError(Messages.LinklfDocumentProvider_handleElementContentChanged, ex);
+				// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.FileDocumentProvider_handleElementContentChanged
+			}
+		}
+		changedResource.unload();
+
+		fireElementContentAboutToBeReplaced(info.getEditorInput());
+		removeUnchangedElementListeners(info.getEditorInput(), info);
+		info.fStatus = null;
+		try {
+			setDocumentContent(info.fDocument, info.getEditorInput());
+		} catch (CoreException e) {
+			info.fStatus = e.getStatus();
+		}
+		if (!info.fCanBeSaved) {
+			info.setModificationStamp(computeModificationStamp(info));
+		}
+		addUnchangedElementListeners(info.getEditorInput(), info);
+		fireElementContentReplaced(info.getEditorInput());
+	}
+
+	/**
+	 * @generated
+	 */
+	protected void handleElementMoved(IEditorInput input, URI uri) {
+		if (input instanceof FileEditorInput) {
+			IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(URI.decode(uri.path())).removeFirstSegments(1));
+			fireElementMoved(input, newFile == null ? null : new FileEditorInput(newFile));
+			return;
+		}
+		// TODO: append suffix to the URI! (use diagram as a parameter)
+		fireElementMoved(input, new URIEditorInput(uri));
+	}
+
+	/**
+	 * @generated
+	 */
+	public IEditorInput createInputWithEditingDomain(IEditorInput editorInput, TransactionalEditingDomain domain) {
+		return editorInput;
+	}
+
+	/**
+	 * @generated
+	 */
+	public IDiagramDocument getDiagramDocument(Object element) {
+		IDocument doc = getDocument(element);
+		if (doc instanceof IDiagramDocument) {
+			return (IDiagramDocument) doc;
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected class ResourceSetInfo extends ElementInfo {
+
+		/**
+		 * @generated
+		 */
+		private long myModificationStamp = IResource.NULL_STAMP;
+
+		/**
+		 * @generated
+		 */
+		private WorkspaceSynchronizer mySynchronizer;
+
+		/**
+		 * @generated
+		 */
+		private LinkedList<Resource> myUnSynchronizedResources = new LinkedList<Resource>();
+
+		/**
+		 * @generated
+		 */
+		private IDiagramDocument myDocument;
+
+		/**
+		 * @generated
+		 */
+		private IEditorInput myEditorInput;
+
+		/**
+		 * @generated
+		 */
+		private boolean myUpdateCache = true;
+
+		/**
+		 * @generated
+		 */
+		private boolean myModifiable = false;
+
+		/**
+		 * @generated
+		 */
+		private boolean myReadOnly = true;
+
+		/**
+		 * @generated
+		 */
+		private ResourceSetModificationListener myResourceSetListener;
+
+		/**
+		 * @generated
+		 */
+		public ResourceSetInfo(IDiagramDocument document, IEditorInput editorInput) {
+			super(document);
+			myDocument = document;
+			myEditorInput = editorInput;
+			startResourceListening();
+			myResourceSetListener = new ResourceSetModificationListener(this);
+			getResourceSet().eAdapters().add(myResourceSetListener);
+		}
+
+		/**
+		 * @generated
+		 */
+		public long getModificationStamp() {
+			return myModificationStamp;
+		}
+
+		/**
+		 * @generated
+		 */
+		public void setModificationStamp(long modificationStamp) {
+			myModificationStamp = modificationStamp;
+		}
+
+		/**
+		 * @generated
+		 */
+		public TransactionalEditingDomain getEditingDomain() {
+			return myDocument.getEditingDomain();
+		}
+
+		/**
+		 * @generated
+		 */
+		public ResourceSet getResourceSet() {
+			return getEditingDomain().getResourceSet();
+		}
+
+		/**
+		 * @generated
+		 */
+		public Iterator<Resource> getLoadedResourcesIterator() {
+			return new ArrayList<Resource>(getResourceSet().getResources()).iterator();
+		}
+
+		/**
+		 * @generated
+		 */
+		public IEditorInput getEditorInput() {
+			return myEditorInput;
+		}
+
+		/**
+		 * @generated
+		 */
+		public void dispose() {
+			stopResourceListening();
+			getResourceSet().eAdapters().remove(myResourceSetListener);
+			for (Iterator<Resource> it = getLoadedResourcesIterator(); it.hasNext();) {
+				Resource resource = it.next();
+				resource.unload();
+			}
+			getEditingDomain().dispose();
+		}
+
+		/**
+		 * @generated
+		 */
+		public boolean isSynchronized() {
+			return myUnSynchronizedResources.size() == 0;
+		}
+
+		/**
+		 * @generated
+		 */
+		public void setUnSynchronized(Resource resource) {
+			myUnSynchronizedResources.add(resource);
+		}
+
+		/**
+		 * @generated
+		 */
+		public void setSynchronized(Resource resource) {
+			myUnSynchronizedResources.remove(resource);
+		}
+
+		/**
+		 * @generated
+		 */
+		public final void stopResourceListening() {
+			mySynchronizer.dispose();
+			mySynchronizer = null;
+		}
+
+		/**
+		 * @generated
+		 */
+		public final void startResourceListening() {
+			mySynchronizer = new WorkspaceSynchronizer(getEditingDomain(), new SynchronizerDelegate());
+		}
+
+		/**
+		 * @generated
+		 */
+		public boolean isUpdateCache() {
+			return myUpdateCache;
+		}
+
+		/**
+		 * @generated
+		 */
+		public void setUpdateCache(boolean update) {
+			myUpdateCache = update;
+		}
+
+		/**
+		 * @generated
+		 */
+		public boolean isModifiable() {
+			return myModifiable;
+		}
+
+		/**
+		 * @generated
+		 */
+		public void setModifiable(boolean modifiable) {
+			myModifiable = modifiable;
+		}
+
+		/**
+		 * @generated
+		 */
+		public boolean isReadOnly() {
+			return myReadOnly;
+		}
+
+		/**
+		 * @generated
+		 */
+		public void setReadOnly(boolean readOnly) {
+			myReadOnly = readOnly;
+		}
+
+		/**
+		 * @generated
+		 */
+		private class SynchronizerDelegate implements WorkspaceSynchronizer.Delegate {
+
+			/**
+			 * @generated
+			 */
+			public void dispose() {
+			}
+
+			/**
+			 * @generated
+			 */
+			public boolean handleResourceChanged(final Resource resource) {
+				synchronized (ResourceSetInfo.this) {
+					if (ResourceSetInfo.this.fCanBeSaved) {
+						ResourceSetInfo.this.setUnSynchronized(resource);
+						return true;
+					}
+				}
+				Display.getDefault().asyncExec(new Runnable() {
+
+					public void run() {
+						handleElementChanged(ResourceSetInfo.this, resource, null);
+					}
+				});
+				return true;
+			}
+
+			/**
+			 * @generated
+			 */
+			public boolean handleResourceDeleted(Resource resource) {
+				synchronized (ResourceSetInfo.this) {
+					if (ResourceSetInfo.this.fCanBeSaved) {
+						ResourceSetInfo.this.setUnSynchronized(resource);
+						return true;
+					}
+				}
+				Display.getDefault().asyncExec(new Runnable() {
+
+					public void run() {
+						fireElementDeleted(ResourceSetInfo.this.getEditorInput());
+					}
+				});
+				return true;
+			}
+
+			/**
+			 * @generated
+			 */
+			public boolean handleResourceMoved(Resource resource, final URI newURI) {
+				synchronized (ResourceSetInfo.this) {
+					if (ResourceSetInfo.this.fCanBeSaved) {
+						ResourceSetInfo.this.setUnSynchronized(resource);
+						return true;
+					}
+				}
+				if (myDocument.getDiagram().eResource() == resource) {
+					Display.getDefault().asyncExec(new Runnable() {
+
+						public void run() {
+							handleElementMoved(ResourceSetInfo.this.getEditorInput(), newURI);
+						}
+					});
+				} else {
+					handleResourceDeleted(resource);
+				}
+				return true;
+			}
+
+		}
+
+	}
+
+	/**
+	 * @generated
+	 */
+	private class ResourceSetModificationListener extends EContentAdapter {
+
+		/**
+		 * @generated
+		 */
+		private NotificationFilter myModifiedFilter;
+
+		/**
+		 * @generated
+		 */
+		private ResourceSetInfo myInfo;
+
+		/**
+		 * @generated
+		 */
+		public ResourceSetModificationListener(ResourceSetInfo info) {
+			myInfo = info;
+			myModifiedFilter = NotificationFilter.createEventTypeFilter(Notification.SET).or(NotificationFilter.createEventTypeFilter(Notification.UNSET))
+					.and(NotificationFilter.createFeatureFilter(Resource.class, Resource.RESOURCE__IS_MODIFIED));
+		}
+
+		/**
+		 * @generated
+		 */
+		public void notifyChanged(Notification notification) {
+			if (notification.getNotifier() instanceof ResourceSet) {
+				super.notifyChanged(notification);
+			}
+			if (!notification.isTouch() && myModifiedFilter.matches(notification)) {
+				if (notification.getNotifier() instanceof Resource) {
+					Resource resource = (Resource) notification.getNotifier();
+					if (resource.isLoaded()) {
+						boolean modified = false;
+						for (Iterator /*<org.eclipse.emf.ecore.resource.Resource>*/ it = myInfo.getLoadedResourcesIterator(); it.hasNext() && !modified;) {
+							Resource nextResource = (Resource) it.next();
+							if (nextResource.isLoaded()) {
+								modified = nextResource.isModified();
+							}
+						}
+						boolean dirtyStateChanged = false;
+						synchronized (myInfo) {
+							if (modified != myInfo.fCanBeSaved) {
+								myInfo.fCanBeSaved = modified;
+								dirtyStateChanged = true;
+							}
+							if (!resource.isModified()) {
+								myInfo.setSynchronized(resource);
+							}
+						}
+						if (dirtyStateChanged) {
+							fireElementDirtyStateChanged(myInfo.getEditorInput(), modified);
+
+							if (!modified) {
+								myInfo.setModificationStamp(computeModificationStamp(myInfo));
+							}
+						}
+					}
+				}
+			}
+		}
+
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfInitDiagramFileAction.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfInitDiagramFileAction.java
new file mode 100644
index 0000000..6b0ffb3
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfInitDiagramFileAction.java
@@ -0,0 +1,86 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.common.util.WrappedException;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @generated
+ */
+public class LinklfInitDiagramFileAction implements IObjectActionDelegate {
+
+	/**
+	 * @generated
+	 */
+	private IWorkbenchPart targetPart;
+
+	/**
+	 * @generated
+	 */
+	private URI domainModelURI;
+
+	/**
+	 * @generated
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+		this.targetPart = targetPart;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		domainModelURI = null;
+		action.setEnabled(false);
+		if (selection instanceof IStructuredSelection == false || selection.isEmpty()) {
+			return;
+		}
+		IFile file = (IFile) ((IStructuredSelection) selection).getFirstElement();
+		domainModelURI = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
+		action.setEnabled(true);
+	}
+
+	/**
+	 * @generated
+	 */
+	private Shell getShell() {
+		return targetPart.getSite().getShell();
+	}
+
+	/**
+	 * @generated
+	 */
+	public void run(IAction action) {
+		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE.createEditingDomain();
+		ResourceSet resourceSet = editingDomain.getResourceSet();
+		EObject diagramRoot = null;
+		try {
+			Resource resource = resourceSet.getResource(domainModelURI, true);
+			diagramRoot = (EObject) resource.getContents().get(0);
+		} catch (WrappedException ex) {
+			LinklfDiagramEditorPlugin.getInstance().logError("Unable to load resource: " + domainModelURI, ex); //$NON-NLS-1$
+		}
+		if (diagramRoot == null) {
+			MessageDialog.openError(getShell(), Messages.InitDiagramFile_ResourceErrorDialogTitle, Messages.InitDiagramFile_ResourceErrorDialogMessage);
+			return;
+		}
+		Wizard wizard = new LinklfNewDiagramFileWizard(domainModelURI, diagramRoot, editingDomain);
+		wizard.setWindowTitle(NLS.bind(Messages.InitDiagramFile_WizardTitle, CanvasEditPart.MODEL_ID));
+		LinklfDiagramEditorUtil.runWizard(getShell(), wizard, "InitDiagramFile"); //$NON-NLS-1$
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfLinkDescriptor.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfLinkDescriptor.java
new file mode 100644
index 0000000..103674b
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfLinkDescriptor.java
@@ -0,0 +1,26 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.runtime.update.UpdaterLinkDescriptor;
+
+/**
+ * @generated
+ */
+public class LinklfLinkDescriptor extends UpdaterLinkDescriptor {
+
+	/**
+	 * @generated
+	 */
+	public LinklfLinkDescriptor(EObject source, EObject destination, IElementType elementType, int linkVID) {
+		super(source, destination, elementType, linkVID);
+	}
+
+	/**
+	 * @generated
+	 */
+	public LinklfLinkDescriptor(EObject source, EObject destination, EObject linkElement, IElementType elementType, int linkVID) {
+		super(source, destination, linkElement, elementType, linkVID);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfMatchingStrategy.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfMatchingStrategy.java
new file mode 100644
index 0000000..021c8ea
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfMatchingStrategy.java
@@ -0,0 +1,34 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.emf.common.ui.URIEditorInput;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorMatchingStrategy;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * @generated
+ */
+public class LinklfMatchingStrategy implements IEditorMatchingStrategy {
+
+	/**
+	 * @generated
+	 */
+	public boolean matches(IEditorReference editorRef, IEditorInput input) {
+		IEditorInput editorInput;
+		try {
+			editorInput = editorRef.getEditorInput();
+		} catch (PartInitException e) {
+			return false;
+		}
+
+		if (editorInput.equals(input)) {
+			return true;
+		}
+		if (editorInput instanceof URIEditorInput && input instanceof URIEditorInput) {
+			return ((URIEditorInput) editorInput).getURI().equals(((URIEditorInput) input).getURI());
+		}
+		return false;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfNewDiagramFileWizard.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfNewDiagramFileWizard.java
new file mode 100644
index 0000000..891d403
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfNewDiagramFileWizard.java
@@ -0,0 +1,162 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import java.io.IOException;
+import java.util.LinkedList;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.operations.OperationHistoryFactory;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateDiagramViewOperation;
+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+
+/**
+ * @generated
+ */
+public class LinklfNewDiagramFileWizard extends Wizard {
+
+	/**
+	 * @generated
+	 */
+	private WizardNewFileCreationPage myFileCreationPage;
+
+	/**
+	 * @generated
+	 */
+	private ModelElementSelectionPage diagramRootElementSelectionPage;
+
+	/**
+	 * @generated
+	 */
+	private TransactionalEditingDomain myEditingDomain;
+
+	/**
+	 * @generated
+	 */
+	public LinklfNewDiagramFileWizard(URI domainModelURI, EObject diagramRoot, TransactionalEditingDomain editingDomain) {
+		assert domainModelURI != null : "Domain model uri must be specified"; //$NON-NLS-1$
+		assert diagramRoot != null : "Doagram root element must be specified"; //$NON-NLS-1$
+		assert editingDomain != null : "Editing domain must be specified"; //$NON-NLS-1$
+
+		myFileCreationPage = new WizardNewFileCreationPage(Messages.LinklfNewDiagramFileWizard_CreationPageName, StructuredSelection.EMPTY);
+		myFileCreationPage.setTitle(Messages.LinklfNewDiagramFileWizard_CreationPageTitle);
+		myFileCreationPage.setDescription(NLS.bind(Messages.LinklfNewDiagramFileWizard_CreationPageDescription, CanvasEditPart.MODEL_ID));
+		IPath filePath;
+		String fileName = URI.decode(domainModelURI.trimFileExtension().lastSegment());
+		if (domainModelURI.isPlatformResource()) {
+			filePath = new Path(domainModelURI.trimSegments(1).toPlatformString(true));
+		} else if (domainModelURI.isFile()) {
+			filePath = new Path(domainModelURI.trimSegments(1).toFileString());
+		} else {
+			// TODO : use some default path
+			throw new IllegalArgumentException("Unsupported URI: " + domainModelURI); //$NON-NLS-1$
+		}
+		myFileCreationPage.setContainerFullPath(filePath);
+		myFileCreationPage.setFileName(LinklfDiagramEditorUtil.getUniqueFileName(filePath, fileName, "linklf_diagram")); //$NON-NLS-1$
+
+		diagramRootElementSelectionPage = new DiagramRootElementSelectionPage(Messages.LinklfNewDiagramFileWizard_RootSelectionPageName);
+		diagramRootElementSelectionPage.setTitle(Messages.LinklfNewDiagramFileWizard_RootSelectionPageTitle);
+		diagramRootElementSelectionPage.setDescription(Messages.LinklfNewDiagramFileWizard_RootSelectionPageDescription);
+		diagramRootElementSelectionPage.setModelElement(diagramRoot);
+
+		myEditingDomain = editingDomain;
+	}
+
+	/**
+	 * @generated
+	 */
+	public void addPages() {
+		addPage(myFileCreationPage);
+		addPage(diagramRootElementSelectionPage);
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean performFinish() {
+		LinkedList<IFile> affectedFiles = new LinkedList<IFile>();
+		IFile diagramFile = myFileCreationPage.createNewFile();
+		LinklfDiagramEditorUtil.setCharset(diagramFile);
+		affectedFiles.add(diagramFile);
+		URI diagramModelURI = URI.createPlatformResourceURI(diagramFile.getFullPath().toString(), true);
+		ResourceSet resourceSet = myEditingDomain.getResourceSet();
+		final Resource diagramResource = resourceSet.createResource(diagramModelURI);
+		AbstractTransactionalCommand command = new AbstractTransactionalCommand(myEditingDomain, Messages.LinklfNewDiagramFileWizard_InitDiagramCommand, affectedFiles) {
+
+			protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+				int diagramVID = LinklfVisualIDRegistry.getDiagramVisualID(diagramRootElementSelectionPage.getModelElement());
+				if (diagramVID != CanvasEditPart.VISUAL_ID) {
+					return CommandResult.newErrorCommandResult(Messages.LinklfNewDiagramFileWizard_IncorrectRootError);
+				}
+				Diagram diagram = ViewService.createDiagram(diagramRootElementSelectionPage.getModelElement(), CanvasEditPart.MODEL_ID, LinklfDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
+				diagramResource.getContents().add(diagram);
+				return CommandResult.newOKCommandResult();
+			}
+		};
+		try {
+			OperationHistoryFactory.getOperationHistory().execute(command, new NullProgressMonitor(), null);
+			diagramResource.save(LinklfDiagramEditorUtil.getSaveOptions());
+			LinklfDiagramEditorUtil.openDiagram(diagramResource);
+		} catch (ExecutionException e) {
+			LinklfDiagramEditorPlugin.getInstance().logError("Unable to create model and diagram", e); //$NON-NLS-1$
+		} catch (IOException ex) {
+			LinklfDiagramEditorPlugin.getInstance().logError("Save operation failed for: " + diagramModelURI, ex); //$NON-NLS-1$
+		} catch (PartInitException ex) {
+			LinklfDiagramEditorPlugin.getInstance().logError("Unable to open editor", ex); //$NON-NLS-1$
+		}
+		return true;
+	}
+
+	/**
+	 * @generated
+	 */
+	private static class DiagramRootElementSelectionPage extends ModelElementSelectionPage {
+
+		/**
+		 * @generated
+		 */
+		protected DiagramRootElementSelectionPage(String pageName) {
+			super(pageName);
+		}
+
+		/**
+		 * @generated
+		 */
+		protected String getSelectionTitle() {
+			return Messages.LinklfNewDiagramFileWizard_RootSelectionPageSelectionTitle;
+		}
+
+		/**
+		 * @generated
+		 */
+		protected boolean validatePage() {
+			if (getModelElement() == null) {
+				setErrorMessage(Messages.LinklfNewDiagramFileWizard_RootSelectionPageNoSelectionMessage);
+				return false;
+			}
+			boolean result = ViewService.getInstance()
+					.provides(new CreateDiagramViewOperation(new EObjectAdapter(getModelElement()), CanvasEditPart.MODEL_ID, LinklfDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT));
+			setErrorMessage(result ? null : Messages.LinklfNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage);
+			return result;
+		}
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfNodeDescriptor.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfNodeDescriptor.java
new file mode 100644
index 0000000..07b4124
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfNodeDescriptor.java
@@ -0,0 +1,18 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.tooling.runtime.update.UpdaterNodeDescriptor;
+
+/**
+ * @generated
+ */
+public class LinklfNodeDescriptor extends UpdaterNodeDescriptor {
+
+	/**
+	 * @generated
+	 */
+	public LinklfNodeDescriptor(EObject modelElement, int visualID) {
+		super(modelElement, visualID);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfPaletteFactory.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfPaletteFactory.java
new file mode 100644
index 0000000..448799f
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfPaletteFactory.java
@@ -0,0 +1,134 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+import org.eclipse.gef.palette.PaletteContainer;
+import org.eclipse.gef.palette.PaletteGroup;
+import org.eclipse.gef.palette.PaletteRoot;
+import org.eclipse.gef.palette.ToolEntry;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.runtime.part.DefaultLinkToolEntry;
+import org.eclipse.gmf.tooling.runtime.part.DefaultNodeToolEntry;
+
+/**
+ * @generated
+ */
+public class LinklfPaletteFactory {
+
+	/**
+	 * @generated
+	 */
+	public void fillPalette(PaletteRoot paletteRoot) {
+		paletteRoot.add(createLinklf1Group());
+	}
+
+	/**
+	 * Creates "linklf" palette tool group
+	 * @generated
+	 */
+	private PaletteContainer createLinklf1Group() {
+		PaletteGroup paletteContainer = new PaletteGroup(Messages.Linklf1Group_title);
+		paletteContainer.setId("createLinklf1Group"); //$NON-NLS-1$
+		paletteContainer.add(createContainer1CreationTool());
+		paletteContainer.add(createRectangle2CreationTool());
+		paletteContainer.add(createCircle3CreationTool());
+		paletteContainer.add(createRhombus4CreationTool());
+		paletteContainer.add(createLink5CreationTool());
+		paletteContainer.add(createLabeledLink6CreationTool());
+		paletteContainer.add(createPort7CreationTool());
+		return paletteContainer;
+	}
+
+	/**
+	 * @generated
+	 */
+	private ToolEntry createContainer1CreationTool() {
+		ArrayList<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Container_2003);
+		types.add(LinklfElementTypes.Container_3002);
+		DefaultNodeToolEntry entry = new DefaultNodeToolEntry(Messages.Container1CreationTool_title, Messages.Container1CreationTool_desc, types);
+		entry.setId("createContainer1CreationTool"); //$NON-NLS-1$
+		entry.setSmallIcon(LinklfElementTypes.getImageDescriptor(LinklfElementTypes.Container_2003));
+		entry.setLargeIcon(entry.getSmallIcon());
+		return entry;
+	}
+
+	/**
+	 * @generated
+	 */
+	private ToolEntry createRectangle2CreationTool() {
+		ArrayList<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Rectangle_2002);
+		types.add(LinklfElementTypes.Rectangle_3003);
+		DefaultNodeToolEntry entry = new DefaultNodeToolEntry(Messages.Rectangle2CreationTool_title, Messages.Rectangle2CreationTool_desc, types);
+		entry.setId("createRectangle2CreationTool"); //$NON-NLS-1$
+		entry.setSmallIcon(LinklfElementTypes.getImageDescriptor(LinklfElementTypes.Rectangle_2002));
+		entry.setLargeIcon(entry.getSmallIcon());
+		return entry;
+	}
+
+	/**
+	 * @generated
+	 */
+	private ToolEntry createCircle3CreationTool() {
+		ArrayList<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Circle_2001);
+		types.add(LinklfElementTypes.Circle_3001);
+		DefaultNodeToolEntry entry = new DefaultNodeToolEntry(Messages.Circle3CreationTool_title, Messages.Circle3CreationTool_desc, types);
+		entry.setId("createCircle3CreationTool"); //$NON-NLS-1$
+		entry.setSmallIcon(LinklfElementTypes.getImageDescriptor(LinklfElementTypes.Circle_2001));
+		entry.setLargeIcon(entry.getSmallIcon());
+		return entry;
+	}
+
+	/**
+	 * @generated
+	 */
+	private ToolEntry createRhombus4CreationTool() {
+		ArrayList<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Rhombus_3004);
+		types.add(LinklfElementTypes.Rhombus_2004);
+		DefaultNodeToolEntry entry = new DefaultNodeToolEntry(Messages.Rhombus4CreationTool_title, Messages.Rhombus4CreationTool_desc, types);
+		entry.setId("createRhombus4CreationTool"); //$NON-NLS-1$
+		entry.setSmallIcon(LinklfElementTypes.getImageDescriptor(LinklfElementTypes.Rhombus_3004));
+		entry.setLargeIcon(entry.getSmallIcon());
+		return entry;
+	}
+
+	/**
+	 * @generated
+	 */
+	private ToolEntry createLink5CreationTool() {
+		DefaultLinkToolEntry entry = new DefaultLinkToolEntry(Messages.Link5CreationTool_title, Messages.Link5CreationTool_desc, Collections.singletonList(LinklfElementTypes.Link_4001));
+		entry.setId("createLink5CreationTool"); //$NON-NLS-1$
+		entry.setSmallIcon(LinklfElementTypes.getImageDescriptor(LinklfElementTypes.Link_4001));
+		entry.setLargeIcon(entry.getSmallIcon());
+		return entry;
+	}
+
+	/**
+	 * @generated
+	 */
+	private ToolEntry createLabeledLink6CreationTool() {
+		DefaultLinkToolEntry entry = new DefaultLinkToolEntry(Messages.LabeledLink6CreationTool_title, Messages.LabeledLink6CreationTool_desc,
+				Collections.singletonList(LinklfElementTypes.LabeledLink_4002));
+		entry.setId("createLabeledLink6CreationTool"); //$NON-NLS-1$
+		entry.setSmallIcon(LinklfElementTypes.getImageDescriptor(LinklfElementTypes.LabeledLink_4002));
+		entry.setLargeIcon(entry.getSmallIcon());
+		return entry;
+	}
+
+	/**
+	 * @generated
+	 */
+	private ToolEntry createPort7CreationTool() {
+		DefaultNodeToolEntry entry = new DefaultNodeToolEntry(Messages.Port7CreationTool_title, Messages.Port7CreationTool_desc, Collections.singletonList(LinklfElementTypes.Port_3005));
+		entry.setId("createPort7CreationTool"); //$NON-NLS-1$
+		entry.setSmallIcon(LinklfElementTypes.getImageDescriptor(LinklfElementTypes.Port_3005));
+		entry.setLargeIcon(entry.getSmallIcon());
+		return entry;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfUriEditorInputTester.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfUriEditorInputTester.java
new file mode 100644
index 0000000..c78e379
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfUriEditorInputTester.java
@@ -0,0 +1,22 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.emf.common.ui.URIEditorInput;
+
+/**
+ * @generated
+ */
+public class LinklfUriEditorInputTester extends PropertyTester {
+
+	/**
+	 * @generated
+	 */
+	public boolean test(Object receiver, String method, Object[] args, Object expectedValue) {
+		if (false == receiver instanceof URIEditorInput) {
+			return false;
+		}
+		URIEditorInput editorInput = (URIEditorInput) receiver;
+		return "linklf_diagram".equals(editorInput.getURI().fileExtension()); //$NON-NLS-1$
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfVisualIDRegistry.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfVisualIDRegistry.java
new file mode 100644
index 0000000..9a9bcc1
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LinklfVisualIDRegistry.java
@@ -0,0 +1,411 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.Canvas;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfPackage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerContainerCompartment2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerContainerCompartmentEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerName2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkLinkNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkSourceNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkTargetNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.runtime.structure.DiagramStructure;
+
+/**
+ * This registry is used to determine which type of visual object should be
+ * created for the corresponding Diagram, Node, ChildNode or Link represented
+ * by a domain model object.
+ * 
+ * @generated
+ */
+public class LinklfVisualIDRegistry {
+
+	/**
+	 * @generated
+	 */
+	private static final String DEBUG_KEY = "org.eclipse.gmf.tooling.examples.linklf.diagram/debug/visualID"; //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static int getVisualID(View view) {
+		if (view instanceof Diagram) {
+			if (CanvasEditPart.MODEL_ID.equals(view.getType())) {
+				return CanvasEditPart.VISUAL_ID;
+			} else {
+				return -1;
+			}
+		}
+		return org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.getVisualID(view.getType());
+	}
+
+	/**
+	 * @generated
+	 */
+	public static String getModelID(View view) {
+		View diagram = view.getDiagram();
+		while (view != diagram) {
+			EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
+			if (annotation != null) {
+				return (String) annotation.getDetails().get("modelID"); //$NON-NLS-1$
+			}
+			view = (View) view.eContainer();
+		}
+		return diagram != null ? diagram.getType() : null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static int getVisualID(String type) {
+		try {
+			return Integer.parseInt(type);
+		} catch (NumberFormatException e) {
+			if (Boolean.TRUE.toString().equalsIgnoreCase(Platform.getDebugOption(DEBUG_KEY))) {
+				LinklfDiagramEditorPlugin.getInstance().logError("Unable to parse view type as a visualID number: " + type);
+			}
+		}
+		return -1;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static String getType(int visualID) {
+		return Integer.toString(visualID);
+	}
+
+	/**
+	 * @generated
+	 */
+	public static int getDiagramVisualID(EObject domainElement) {
+		if (domainElement == null) {
+			return -1;
+		}
+		if (LinklfPackage.eINSTANCE.getCanvas().isSuperTypeOf(domainElement.eClass()) && isDiagram((Canvas) domainElement)) {
+			return CanvasEditPart.VISUAL_ID;
+		}
+		return -1;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static int getNodeVisualID(View containerView, EObject domainElement) {
+		if (domainElement == null) {
+			return -1;
+		}
+		String containerModelID = org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.getModelID(containerView);
+		if (!CanvasEditPart.MODEL_ID.equals(containerModelID)) {
+			return -1;
+		}
+		int containerVisualID;
+		if (CanvasEditPart.MODEL_ID.equals(containerModelID)) {
+			containerVisualID = org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.getVisualID(containerView);
+		} else {
+			if (containerView instanceof Diagram) {
+				containerVisualID = CanvasEditPart.VISUAL_ID;
+			} else {
+				return -1;
+			}
+		}
+		switch (containerVisualID) {
+		case CanvasEditPart.VISUAL_ID:
+			if (LinklfPackage.eINSTANCE.getCircle().isSuperTypeOf(domainElement.eClass())) {
+				return CircleEditPart.VISUAL_ID;
+			}
+			if (LinklfPackage.eINSTANCE.getRectangle().isSuperTypeOf(domainElement.eClass())) {
+				return RectangleEditPart.VISUAL_ID;
+			}
+			if (LinklfPackage.eINSTANCE.getContainer().isSuperTypeOf(domainElement.eClass())) {
+				return ContainerEditPart.VISUAL_ID;
+			}
+			if (LinklfPackage.eINSTANCE.getRhombus().isSuperTypeOf(domainElement.eClass())) {
+				return RhombusEditPart.VISUAL_ID;
+			}
+			break;
+		case ContainerEditPart.VISUAL_ID:
+			if (LinklfPackage.eINSTANCE.getPort().isSuperTypeOf(domainElement.eClass())) {
+				return PortEditPart.VISUAL_ID;
+			}
+			break;
+		case Container2EditPart.VISUAL_ID:
+			if (LinklfPackage.eINSTANCE.getPort().isSuperTypeOf(domainElement.eClass())) {
+				return PortEditPart.VISUAL_ID;
+			}
+			break;
+		case ContainerContainerCompartmentEditPart.VISUAL_ID:
+			if (LinklfPackage.eINSTANCE.getCircle().isSuperTypeOf(domainElement.eClass())) {
+				return Circle2EditPart.VISUAL_ID;
+			}
+			if (LinklfPackage.eINSTANCE.getContainer().isSuperTypeOf(domainElement.eClass())) {
+				return Container2EditPart.VISUAL_ID;
+			}
+			if (LinklfPackage.eINSTANCE.getRectangle().isSuperTypeOf(domainElement.eClass())) {
+				return Rectangle2EditPart.VISUAL_ID;
+			}
+			if (LinklfPackage.eINSTANCE.getRhombus().isSuperTypeOf(domainElement.eClass())) {
+				return Rhombus2EditPart.VISUAL_ID;
+			}
+			break;
+		case ContainerContainerCompartment2EditPart.VISUAL_ID:
+			if (LinklfPackage.eINSTANCE.getCircle().isSuperTypeOf(domainElement.eClass())) {
+				return Circle2EditPart.VISUAL_ID;
+			}
+			if (LinklfPackage.eINSTANCE.getContainer().isSuperTypeOf(domainElement.eClass())) {
+				return Container2EditPart.VISUAL_ID;
+			}
+			if (LinklfPackage.eINSTANCE.getRectangle().isSuperTypeOf(domainElement.eClass())) {
+				return Rectangle2EditPart.VISUAL_ID;
+			}
+			if (LinklfPackage.eINSTANCE.getRhombus().isSuperTypeOf(domainElement.eClass())) {
+				return Rhombus2EditPart.VISUAL_ID;
+			}
+			break;
+		}
+		return -1;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static boolean canCreateNode(View containerView, int nodeVisualID) {
+		String containerModelID = org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.getModelID(containerView);
+		if (!CanvasEditPart.MODEL_ID.equals(containerModelID)) {
+			return false;
+		}
+		int containerVisualID;
+		if (CanvasEditPart.MODEL_ID.equals(containerModelID)) {
+			containerVisualID = org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.getVisualID(containerView);
+		} else {
+			if (containerView instanceof Diagram) {
+				containerVisualID = CanvasEditPart.VISUAL_ID;
+			} else {
+				return false;
+			}
+		}
+		switch (containerVisualID) {
+		case CanvasEditPart.VISUAL_ID:
+			if (CircleEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (RectangleEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (ContainerEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (RhombusEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			break;
+		case ContainerEditPart.VISUAL_ID:
+			if (ContainerNameEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (ContainerContainerCompartmentEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (PortEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			break;
+		case Container2EditPart.VISUAL_ID:
+			if (ContainerName2EditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (ContainerContainerCompartment2EditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (PortEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			break;
+		case ContainerContainerCompartmentEditPart.VISUAL_ID:
+			if (Circle2EditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (Container2EditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (Rectangle2EditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (Rhombus2EditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			break;
+		case ContainerContainerCompartment2EditPart.VISUAL_ID:
+			if (Circle2EditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (Container2EditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (Rectangle2EditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (Rhombus2EditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			break;
+		case LabeledLinkEditPart.VISUAL_ID:
+			if (LabeledLinkSourceNameEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (LabeledLinkTargetNameEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			if (LabeledLinkLinkNameEditPart.VISUAL_ID == nodeVisualID) {
+				return true;
+			}
+			break;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static int getLinkWithClassVisualID(EObject domainElement) {
+		if (domainElement == null) {
+			return -1;
+		}
+		if (LinklfPackage.eINSTANCE.getLink().isSuperTypeOf(domainElement.eClass())) {
+			return LinkEditPart.VISUAL_ID;
+		}
+		if (LinklfPackage.eINSTANCE.getLabeledLink().isSuperTypeOf(domainElement.eClass())) {
+			return LabeledLinkEditPart.VISUAL_ID;
+		}
+		return -1;
+	}
+
+	/**
+	 * User can change implementation of this method to handle some specific
+	 * situations not covered by default logic.
+	 * 
+	 * @generated
+	 */
+	private static boolean isDiagram(Canvas element) {
+		return true;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static boolean checkNodeVisualID(View containerView, EObject domainElement, int candidate) {
+		if (candidate == -1) {
+			//unrecognized id is always bad
+			return false;
+		}
+		int basic = getNodeVisualID(containerView, domainElement);
+		return basic == candidate;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static boolean isCompartmentVisualID(int visualID) {
+		switch (visualID) {
+		case ContainerContainerCompartmentEditPart.VISUAL_ID:
+		case ContainerContainerCompartment2EditPart.VISUAL_ID:
+			return true;
+		default:
+			break;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static boolean isSemanticLeafVisualID(int visualID) {
+		switch (visualID) {
+		case CanvasEditPart.VISUAL_ID:
+			return false;
+		case CircleEditPart.VISUAL_ID:
+		case RectangleEditPart.VISUAL_ID:
+		case RhombusEditPart.VISUAL_ID:
+		case Circle2EditPart.VISUAL_ID:
+		case Rectangle2EditPart.VISUAL_ID:
+		case Rhombus2EditPart.VISUAL_ID:
+		case PortEditPart.VISUAL_ID:
+			return true;
+		default:
+			break;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static final DiagramStructure TYPED_INSTANCE = new DiagramStructure() {
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public int getVisualID(View view) {
+			return org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.getVisualID(view);
+		}
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public String getModelID(View view) {
+			return org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.getModelID(view);
+		}
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public int getNodeVisualID(View containerView, EObject domainElement) {
+			return org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.getNodeVisualID(containerView, domainElement);
+		}
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public boolean checkNodeVisualID(View containerView, EObject domainElement, int candidate) {
+			return org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.checkNodeVisualID(containerView, domainElement, candidate);
+		}
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public boolean isCompartmentVisualID(int visualID) {
+			return org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.isCompartmentVisualID(visualID);
+		}
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public boolean isSemanticLeafVisualID(int visualID) {
+			return org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry.isSemanticLeafVisualID(visualID);
+		}
+	};
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LoadResourceAction.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LoadResourceAction.java
new file mode 100644
index 0000000..c4a0926
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/LoadResourceAction.java
@@ -0,0 +1,19 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.gmf.tooling.runtime.actions.DefaultLoadResourceAction;
+
+/**
+ * @generated
+ */
+public class LoadResourceAction extends DefaultLoadResourceAction {
+
+	/**
+	 * @generated
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		return super.execute(event);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/Messages.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/Messages.java
new file mode 100644
index 0000000..c220d13
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/Messages.java
@@ -0,0 +1,449 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @generated
+ */
+public class Messages extends NLS {
+
+	/**
+	 * @generated
+	 */
+	static {
+		NLS.initializeMessages("messages", Messages.class); //$NON-NLS-1$
+	}
+
+	/**
+	 * @generated
+	 */
+	private Messages() {
+	}
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfCreationWizardTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfCreationWizard_DiagramModelFilePageTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfCreationWizard_DiagramModelFilePageDescription;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfCreationWizard_DomainModelFilePageTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfCreationWizard_DomainModelFilePageDescription;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfCreationWizardOpenEditorError;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfCreationWizardCreationError;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfCreationWizardPageExtensionError;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDiagramEditorUtil_OpenModelResourceErrorDialogTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDiagramEditorUtil_OpenModelResourceErrorDialogMessage;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDiagramEditorUtil_CreateDiagramProgressTask;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDiagramEditorUtil_CreateDiagramCommandLabel;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDocumentProvider_isModifiable;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDocumentProvider_handleElementContentChanged;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDocumentProvider_IncorrectInputError;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDocumentProvider_NoDiagramInResourceError;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDocumentProvider_DiagramLoadingError;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDocumentProvider_UnsynchronizedFileSaveError;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDocumentProvider_SaveDiagramTask;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDocumentProvider_SaveNextResourceTask;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDocumentProvider_SaveAsOperation;
+
+	/**
+	 * @generated
+	 */
+	public static String InitDiagramFile_ResourceErrorDialogTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String InitDiagramFile_ResourceErrorDialogMessage;
+
+	/**
+	 * @generated
+	 */
+	public static String InitDiagramFile_WizardTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String InitDiagramFile_OpenModelFileDialogTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_CreationPageName;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_CreationPageTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_CreationPageDescription;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_RootSelectionPageName;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_RootSelectionPageTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_RootSelectionPageDescription;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_RootSelectionPageSelectionTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_RootSelectionPageNoSelectionMessage;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_InitDiagramCommand;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfNewDiagramFileWizard_IncorrectRootError;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDiagramEditor_SavingDeletedFile;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDiagramEditor_SaveAsErrorTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDiagramEditor_SaveAsErrorMessage;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDiagramEditor_SaveErrorTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfDiagramEditor_SaveErrorMessage;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfElementChooserDialog_SelectModelElementTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String ModelElementSelectionPageMessage;
+
+	/**
+	 * @generated
+	 */
+	public static String ValidateActionMessage;
+
+	/**
+	 * @generated
+	 */
+	public static String Linklf1Group_title;
+
+	/**
+	 * @generated
+	 */
+	public static String Container1CreationTool_title;
+
+	/**
+	 * @generated
+	 */
+	public static String Container1CreationTool_desc;
+
+	/**
+	 * @generated
+	 */
+	public static String Rectangle2CreationTool_title;
+
+	/**
+	 * @generated
+	 */
+	public static String Rectangle2CreationTool_desc;
+
+	/**
+	 * @generated
+	 */
+	public static String Circle3CreationTool_title;
+
+	/**
+	 * @generated
+	 */
+	public static String Circle3CreationTool_desc;
+
+	/**
+	 * @generated
+	 */
+	public static String Rhombus4CreationTool_title;
+
+	/**
+	 * @generated
+	 */
+	public static String Rhombus4CreationTool_desc;
+
+	/**
+	 * @generated
+	 */
+	public static String Link5CreationTool_title;
+
+	/**
+	 * @generated
+	 */
+	public static String Link5CreationTool_desc;
+
+	/**
+	 * @generated
+	 */
+	public static String LabeledLink6CreationTool_title;
+
+	/**
+	 * @generated
+	 */
+	public static String LabeledLink6CreationTool_desc;
+
+	/**
+	 * @generated
+	 */
+	public static String Port7CreationTool_title;
+
+	/**
+	 * @generated
+	 */
+	public static String Port7CreationTool_desc;
+
+	/**
+	 * @generated
+	 */
+	public static String ContainerContainerCompartmentEditPart_title;
+
+	/**
+	 * @generated
+	 */
+	public static String ContainerContainerCompartment2EditPart_title;
+
+	/**
+	 * @generated
+	 */
+	public static String CommandName_OpenDiagram;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Canvas_1000_links;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Circle_2001_incominglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Circle_2001_outgoinglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Rectangle_2002_incominglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Rectangle_2002_outgoinglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Rhombus_2004_incominglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Rhombus_2004_outgoinglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Circle_3001_incominglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Circle_3001_outgoinglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Rectangle_3003_incominglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Rectangle_3003_outgoinglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Rhombus_3004_incominglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Rhombus_3004_outgoinglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Port_3005_incominglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Port_3005_outgoinglinks;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Link_4001_target;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_Link_4001_source;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_LabeledLink_4002_target;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorGroupName_LabeledLink_4002_source;
+
+	/**
+	 * @generated
+	 */
+	public static String NavigatorActionProvider_OpenDiagramActionName;
+
+	/**
+	 * @generated
+	 */
+	public static String MessageFormatParser_InvalidInputError;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfModelingAssistantProviderTitle;
+
+	/**
+	 * @generated
+	 */
+	public static String LinklfModelingAssistantProviderMessage;
+
+	//TODO: put accessor fields manually	
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/ModelElementSelectionPage.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/ModelElementSelectionPage.java
new file mode 100644
index 0000000..fb51a2a
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/part/ModelElementSelectionPage.java
@@ -0,0 +1,26 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.part;
+
+import org.eclipse.gmf.tooling.runtime.part.DefaultModelElementSelectionPage;
+
+/**
+ * Wizard page that allows to select element from model.
+ * @generated
+ */
+public class ModelElementSelectionPage extends DefaultModelElementSelectionPage {
+
+	/**
+	 * @generated
+	 */
+	public ModelElementSelectionPage(String pageName) {
+		super(LinklfDiagramEditorPlugin.getInstance().getItemProvidersAdapterFactory(), pageName);
+	}
+
+	/**
+	 * Override to provide custom model element description.
+	 * @generated
+	 */
+	protected String getSelectionTitle() {
+		return Messages.ModelElementSelectionPageMessage;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramAppearancePreferencePage.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramAppearancePreferencePage.java
new file mode 100644
index 0000000..d7bc29c
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramAppearancePreferencePage.java
@@ -0,0 +1,17 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.preferences;
+
+import org.eclipse.gmf.runtime.diagram.ui.preferences.AppearancePreferencePage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+
+/**
+ * @generated
+ */
+public class DiagramAppearancePreferencePage extends AppearancePreferencePage {
+
+	/**
+	 * @generated
+	 */
+	public DiagramAppearancePreferencePage() {
+		setPreferenceStore(LinklfDiagramEditorPlugin.getInstance().getPreferenceStore());
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramConnectionsPreferencePage.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramConnectionsPreferencePage.java
new file mode 100644
index 0000000..bf9947b
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramConnectionsPreferencePage.java
@@ -0,0 +1,17 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.preferences;
+
+import org.eclipse.gmf.runtime.diagram.ui.preferences.ConnectionsPreferencePage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+
+/**
+ * @generated
+ */
+public class DiagramConnectionsPreferencePage extends ConnectionsPreferencePage {
+
+	/**
+	 * @generated
+	 */
+	public DiagramConnectionsPreferencePage() {
+		setPreferenceStore(LinklfDiagramEditorPlugin.getInstance().getPreferenceStore());
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramGeneralPreferencePage.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramGeneralPreferencePage.java
new file mode 100644
index 0000000..c5fe7dc
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramGeneralPreferencePage.java
@@ -0,0 +1,17 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.preferences;
+
+import org.eclipse.gmf.runtime.diagram.ui.preferences.DiagramsPreferencePage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+
+/**
+ * @generated
+ */
+public class DiagramGeneralPreferencePage extends DiagramsPreferencePage {
+
+	/**
+	 * @generated
+	 */
+	public DiagramGeneralPreferencePage() {
+		setPreferenceStore(LinklfDiagramEditorPlugin.getInstance().getPreferenceStore());
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramPreferenceInitializer.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramPreferenceInitializer.java
new file mode 100644
index 0000000..574b689
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramPreferenceInitializer.java
@@ -0,0 +1,31 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+/**
+ * @generated
+ */
+public class DiagramPreferenceInitializer extends AbstractPreferenceInitializer {
+
+	/**
+	 * @generated
+	 */
+	public void initializeDefaultPreferences() {
+		IPreferenceStore store = getPreferenceStore();
+		DiagramGeneralPreferencePage.initDefaults(store);
+		DiagramAppearancePreferencePage.initDefaults(store);
+		DiagramConnectionsPreferencePage.initDefaults(store);
+		DiagramPrintingPreferencePage.initDefaults(store);
+		DiagramRulersAndGridPreferencePage.initDefaults(store);
+
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IPreferenceStore getPreferenceStore() {
+		return LinklfDiagramEditorPlugin.getInstance().getPreferenceStore();
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramPrintingPreferencePage.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramPrintingPreferencePage.java
new file mode 100644
index 0000000..b33ba3f
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramPrintingPreferencePage.java
@@ -0,0 +1,17 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.preferences;
+
+import org.eclipse.gmf.runtime.diagram.ui.preferences.PrintingPreferencePage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+
+/**
+ * @generated
+ */
+public class DiagramPrintingPreferencePage extends PrintingPreferencePage {
+
+	/**
+	 * @generated
+	 */
+	public DiagramPrintingPreferencePage() {
+		setPreferenceStore(LinklfDiagramEditorPlugin.getInstance().getPreferenceStore());
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramRulersAndGridPreferencePage.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramRulersAndGridPreferencePage.java
new file mode 100644
index 0000000..88c3bc6
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/preferences/DiagramRulersAndGridPreferencePage.java
@@ -0,0 +1,17 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.preferences;
+
+import org.eclipse.gmf.runtime.diagram.ui.preferences.RulerGridPreferencePage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+
+/**
+ * @generated
+ */
+public class DiagramRulersAndGridPreferencePage extends RulerGridPreferencePage {
+
+	/**
+	 * @generated
+	 */
+	public DiagramRulersAndGridPreferencePage() {
+		setPreferenceStore(LinklfDiagramEditorPlugin.getInstance().getPreferenceStore());
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/ElementInitializers.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/ElementInitializers.java
new file mode 100644
index 0000000..e953173
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/ElementInitializers.java
@@ -0,0 +1,24 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers;
+
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+
+/**
+ * @generated
+ */
+public class ElementInitializers {
+
+	protected ElementInitializers() {
+		// use #getInstance to access cached instance
+	}
+
+	/**
+	 * @generated
+	 */
+	public static ElementInitializers getInstance() {
+		ElementInitializers cached = LinklfDiagramEditorPlugin.getInstance().getElementInitializers();
+		if (cached == null) {
+			LinklfDiagramEditorPlugin.getInstance().setElementInitializers(cached = new ElementInitializers());
+		}
+		return cached;
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfEditPartProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfEditPartProvider.java
new file mode 100644
index 0000000..647a2d2
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfEditPartProvider.java
@@ -0,0 +1,20 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers;
+
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinklfEditPartFactory;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.runtime.providers.DefaultEditPartProvider;
+
+/**
+ * @generated
+ */
+public class LinklfEditPartProvider extends DefaultEditPartProvider {
+
+	/**
+	 * @generated
+	 */
+	public LinklfEditPartProvider() {
+		super(new LinklfEditPartFactory(), LinklfVisualIDRegistry.TYPED_INSTANCE, CanvasEditPart.MODEL_ID);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfElementTypes.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfElementTypes.java
new file mode 100644
index 0000000..6899f6d
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfElementTypes.java
@@ -0,0 +1,274 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers;
+
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.ENamedElement;
+import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfPackage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+import org.eclipse.gmf.tooling.runtime.providers.DiagramElementTypeImages;
+import org.eclipse.gmf.tooling.runtime.providers.DiagramElementTypes;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @generated
+ */
+public class LinklfElementTypes {
+
+	/**
+	 * @generated
+	 */
+	private LinklfElementTypes() {
+	}
+
+	/**
+	 * @generated
+	 */
+	private static Map<IElementType, ENamedElement> elements;
+
+	/**
+	 * @generated
+	 */
+	private static DiagramElementTypeImages elementTypeImages = new DiagramElementTypeImages(LinklfDiagramEditorPlugin.getInstance().getItemProvidersAdapterFactory());
+
+	/**
+	 * @generated
+	 */
+	private static Set<IElementType> KNOWN_ELEMENT_TYPES;
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Canvas_1000 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Canvas_1000"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Circle_2001 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Circle_2001"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Rectangle_2002 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Rectangle_2002"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Container_2003 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Container_2003"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Rhombus_2004 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Rhombus_2004"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Circle_3001 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Circle_3001"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Container_3002 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Container_3002"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Rectangle_3003 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Rectangle_3003"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Rhombus_3004 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Rhombus_3004"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Port_3005 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Port_3005"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType Link_4001 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.Link_4001"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static final IElementType LabeledLink_4002 = getElementType("org.eclipse.gmf.tooling.examples.linklf.diagram.LabeledLink_4002"); //$NON-NLS-1$
+
+	/**
+	 * @generated
+	 */
+	public static ImageDescriptor getImageDescriptor(ENamedElement element) {
+		return elementTypeImages.getImageDescriptor(element);
+	}
+
+	/**
+	 * @generated
+	 */
+	public static Image getImage(ENamedElement element) {
+		return elementTypeImages.getImage(element);
+	}
+
+	/**
+	 * @generated
+	 */
+	public static ImageDescriptor getImageDescriptor(IAdaptable hint) {
+		return getImageDescriptor(getElement(hint));
+	}
+
+	/**
+	 * @generated
+	 */
+	public static Image getImage(IAdaptable hint) {
+		return getImage(getElement(hint));
+	}
+
+	/**
+	 * Returns 'type' of the ecore object associated with the hint.
+	 * 
+	 * @generated
+	 */
+	public static ENamedElement getElement(IAdaptable hint) {
+		Object type = hint.getAdapter(IElementType.class);
+		if (elements == null) {
+			elements = new IdentityHashMap<IElementType, ENamedElement>();
+
+			elements.put(Canvas_1000, LinklfPackage.eINSTANCE.getCanvas());
+
+			elements.put(Circle_2001, LinklfPackage.eINSTANCE.getCircle());
+
+			elements.put(Rectangle_2002, LinklfPackage.eINSTANCE.getRectangle());
+
+			elements.put(Container_2003, LinklfPackage.eINSTANCE.getContainer());
+
+			elements.put(Rhombus_2004, LinklfPackage.eINSTANCE.getRhombus());
+
+			elements.put(Circle_3001, LinklfPackage.eINSTANCE.getCircle());
+
+			elements.put(Container_3002, LinklfPackage.eINSTANCE.getContainer());
+
+			elements.put(Rectangle_3003, LinklfPackage.eINSTANCE.getRectangle());
+
+			elements.put(Rhombus_3004, LinklfPackage.eINSTANCE.getRhombus());
+
+			elements.put(Port_3005, LinklfPackage.eINSTANCE.getPort());
+
+			elements.put(Link_4001, LinklfPackage.eINSTANCE.getLink());
+
+			elements.put(LabeledLink_4002, LinklfPackage.eINSTANCE.getLabeledLink());
+		}
+		return (ENamedElement) elements.get(type);
+	}
+
+	/**
+	 * @generated
+	 */
+	private static IElementType getElementType(String id) {
+		return ElementTypeRegistry.getInstance().getType(id);
+	}
+
+	/**
+	 * @generated
+	 */
+	public static boolean isKnownElementType(IElementType elementType) {
+		if (KNOWN_ELEMENT_TYPES == null) {
+			KNOWN_ELEMENT_TYPES = new HashSet<IElementType>();
+			KNOWN_ELEMENT_TYPES.add(Canvas_1000);
+			KNOWN_ELEMENT_TYPES.add(Circle_2001);
+			KNOWN_ELEMENT_TYPES.add(Rectangle_2002);
+			KNOWN_ELEMENT_TYPES.add(Container_2003);
+			KNOWN_ELEMENT_TYPES.add(Rhombus_2004);
+			KNOWN_ELEMENT_TYPES.add(Circle_3001);
+			KNOWN_ELEMENT_TYPES.add(Container_3002);
+			KNOWN_ELEMENT_TYPES.add(Rectangle_3003);
+			KNOWN_ELEMENT_TYPES.add(Rhombus_3004);
+			KNOWN_ELEMENT_TYPES.add(Port_3005);
+			KNOWN_ELEMENT_TYPES.add(Link_4001);
+			KNOWN_ELEMENT_TYPES.add(LabeledLink_4002);
+		}
+		return KNOWN_ELEMENT_TYPES.contains(elementType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public static IElementType getElementType(int visualID) {
+		switch (visualID) {
+		case CanvasEditPart.VISUAL_ID:
+			return Canvas_1000;
+		case CircleEditPart.VISUAL_ID:
+			return Circle_2001;
+		case RectangleEditPart.VISUAL_ID:
+			return Rectangle_2002;
+		case ContainerEditPart.VISUAL_ID:
+			return Container_2003;
+		case RhombusEditPart.VISUAL_ID:
+			return Rhombus_2004;
+		case Circle2EditPart.VISUAL_ID:
+			return Circle_3001;
+		case Container2EditPart.VISUAL_ID:
+			return Container_3002;
+		case Rectangle2EditPart.VISUAL_ID:
+			return Rectangle_3003;
+		case Rhombus2EditPart.VISUAL_ID:
+			return Rhombus_3004;
+		case PortEditPart.VISUAL_ID:
+			return Port_3005;
+		case LinkEditPart.VISUAL_ID:
+			return Link_4001;
+		case LabeledLinkEditPart.VISUAL_ID:
+			return LabeledLink_4002;
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public static final DiagramElementTypes TYPED_INSTANCE = new DiagramElementTypes(elementTypeImages) {
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public boolean isKnownElementType(IElementType elementType) {
+			return org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes.isKnownElementType(elementType);
+		}
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public IElementType getElementTypeForVisualId(int visualID) {
+			return org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes.getElementType(visualID);
+		}
+
+		/**
+		 * @generated
+		 */
+		@Override
+		public ENamedElement getDefiningNamedElement(IAdaptable elementTypeAdapter) {
+			return org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes.getElement(elementTypeAdapter);
+		}
+	};
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfIconProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfIconProvider.java
new file mode 100644
index 0000000..529c46c
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfIconProvider.java
@@ -0,0 +1,18 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers;
+
+import org.eclipse.gmf.runtime.common.ui.services.icon.IIconProvider;
+import org.eclipse.gmf.tooling.runtime.providers.DefaultElementTypeIconProvider;
+
+/**
+ * @generated
+ */
+public class LinklfIconProvider extends DefaultElementTypeIconProvider implements IIconProvider {
+
+	/**
+	 * @generated
+	 */
+	public LinklfIconProvider() {
+		super(LinklfElementTypes.TYPED_INSTANCE);
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfModelingAssistantProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfModelingAssistantProvider.java
new file mode 100644
index 0000000..c505602
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfModelingAssistantProvider.java
@@ -0,0 +1,93 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.ui.services.modelingassistant.ModelingAssistantProvider;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfDiagramEditorPlugin;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.Messages;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+
+/**
+ * @generated
+ */
+public class LinklfModelingAssistantProvider extends ModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	public EObject selectExistingElementForSource(IAdaptable target, IElementType relationshipType) {
+		return selectExistingElement(target, getTypesForSource(target, relationshipType));
+	}
+
+	/**
+	 * @generated
+	 */
+	public EObject selectExistingElementForTarget(IAdaptable source, IElementType relationshipType) {
+		return selectExistingElement(source, getTypesForTarget(source, relationshipType));
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EObject selectExistingElement(IAdaptable host, Collection types) {
+		if (types.isEmpty()) {
+			return null;
+		}
+		IGraphicalEditPart editPart = (IGraphicalEditPart) host.getAdapter(IGraphicalEditPart.class);
+		if (editPart == null) {
+			return null;
+		}
+		Diagram diagram = (Diagram) editPart.getRoot().getContents().getModel();
+		HashSet<EObject> elements = new HashSet<EObject>();
+		for (Iterator<EObject> it = diagram.getElement().eAllContents(); it.hasNext();) {
+			EObject element = it.next();
+			if (isApplicableElement(element, types)) {
+				elements.add(element);
+			}
+		}
+		if (elements.isEmpty()) {
+			return null;
+		}
+		return selectElement((EObject[]) elements.toArray(new EObject[elements.size()]));
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean isApplicableElement(EObject element, Collection types) {
+		IElementType type = ElementTypeRegistry.getInstance().getElementType(element);
+		return types.contains(type);
+	}
+
+	/**
+	 * @generated
+	 */
+	protected EObject selectElement(EObject[] elements) {
+		Shell shell = Display.getCurrent().getActiveShell();
+		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(LinklfDiagramEditorPlugin.getInstance().getItemProvidersAdapterFactory());
+		ElementListSelectionDialog dialog = new ElementListSelectionDialog(shell, labelProvider);
+		dialog.setMessage(Messages.LinklfModelingAssistantProviderMessage);
+		dialog.setTitle(Messages.LinklfModelingAssistantProviderTitle);
+		dialog.setMultipleSelection(false);
+		dialog.setElements(elements);
+		EObject selected = null;
+		if (dialog.open() == Window.OK) {
+			selected = (EObject) dialog.getFirstResult();
+		}
+		return selected;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfParserProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfParserProvider.java
new file mode 100644
index 0000000..9f7b873
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfParserProvider.java
@@ -0,0 +1,200 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
+import org.eclipse.gmf.runtime.common.core.service.IOperation;
+import org.eclipse.gmf.runtime.common.ui.services.parser.GetParserOperation;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserProvider;
+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.LinklfPackage;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerName2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkLinkNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkSourceNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkTargetNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.parsers.MessageFormatParser;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+
+/**
+ * @generated
+ */
+public class LinklfParserProvider extends AbstractProvider implements IParserProvider {
+
+	/**
+	 * @generated
+	 */
+	private IParser containerName_5002Parser;
+
+	/**
+	 * @generated
+	 */
+	private IParser getContainerName_5002Parser() {
+		if (containerName_5002Parser == null) {
+			EAttribute[] features = new EAttribute[] { LinklfPackage.eINSTANCE.getContainer_Name() };
+			MessageFormatParser parser = new MessageFormatParser(features);
+			containerName_5002Parser = parser;
+		}
+		return containerName_5002Parser;
+	}
+
+	/**
+	 * @generated
+	 */
+	private IParser containerName_5001Parser;
+
+	/**
+	 * @generated
+	 */
+	private IParser getContainerName_5001Parser() {
+		if (containerName_5001Parser == null) {
+			EAttribute[] features = new EAttribute[] { LinklfPackage.eINSTANCE.getContainer_Name() };
+			MessageFormatParser parser = new MessageFormatParser(features);
+			containerName_5001Parser = parser;
+		}
+		return containerName_5001Parser;
+	}
+
+	/**
+	 * @generated
+	 */
+	private IParser labeledLinkSourceName_6001Parser;
+
+	/**
+	 * @generated
+	 */
+	private IParser getLabeledLinkSourceName_6001Parser() {
+		if (labeledLinkSourceName_6001Parser == null) {
+			EAttribute[] features = new EAttribute[] { LinklfPackage.eINSTANCE.getLabeledLink_SourceName() };
+			MessageFormatParser parser = new MessageFormatParser(features);
+			labeledLinkSourceName_6001Parser = parser;
+		}
+		return labeledLinkSourceName_6001Parser;
+	}
+
+	/**
+	 * @generated
+	 */
+	private IParser labeledLinkTargetName_6002Parser;
+
+	/**
+	 * @generated
+	 */
+	private IParser getLabeledLinkTargetName_6002Parser() {
+		if (labeledLinkTargetName_6002Parser == null) {
+			EAttribute[] features = new EAttribute[] { LinklfPackage.eINSTANCE.getLabeledLink_TargetName() };
+			MessageFormatParser parser = new MessageFormatParser(features);
+			labeledLinkTargetName_6002Parser = parser;
+		}
+		return labeledLinkTargetName_6002Parser;
+	}
+
+	/**
+	 * @generated
+	 */
+	private IParser labeledLinkLinkName_6003Parser;
+
+	/**
+	 * @generated
+	 */
+	private IParser getLabeledLinkLinkName_6003Parser() {
+		if (labeledLinkLinkName_6003Parser == null) {
+			EAttribute[] features = new EAttribute[] { LinklfPackage.eINSTANCE.getLabeledLink_LinkName() };
+			MessageFormatParser parser = new MessageFormatParser(features);
+			labeledLinkLinkName_6003Parser = parser;
+		}
+		return labeledLinkLinkName_6003Parser;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected IParser getParser(int visualID) {
+		switch (visualID) {
+		case ContainerNameEditPart.VISUAL_ID:
+			return getContainerName_5002Parser();
+		case ContainerName2EditPart.VISUAL_ID:
+			return getContainerName_5001Parser();
+		case LabeledLinkSourceNameEditPart.VISUAL_ID:
+			return getLabeledLinkSourceName_6001Parser();
+		case LabeledLinkTargetNameEditPart.VISUAL_ID:
+			return getLabeledLinkTargetName_6002Parser();
+		case LabeledLinkLinkNameEditPart.VISUAL_ID:
+			return getLabeledLinkLinkName_6003Parser();
+		}
+		return null;
+	}
+
+	/**
+	 * Utility method that consults ParserService
+	 * @generated
+	 */
+	public static IParser getParser(IElementType type, EObject object, String parserHint) {
+		return ParserService.getInstance().getParser(new HintAdapter(type, object, parserHint));
+	}
+
+	/**
+	 * @generated
+	 */
+	public IParser getParser(IAdaptable hint) {
+		String vid = (String) hint.getAdapter(String.class);
+		if (vid != null) {
+			return getParser(LinklfVisualIDRegistry.getVisualID(vid));
+		}
+		View view = (View) hint.getAdapter(View.class);
+		if (view != null) {
+			return getParser(LinklfVisualIDRegistry.getVisualID(view));
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public boolean provides(IOperation operation) {
+		if (operation instanceof GetParserOperation) {
+			IAdaptable hint = ((GetParserOperation) operation).getHint();
+			if (LinklfElementTypes.getElement(hint) == null) {
+				return false;
+			}
+			return getParser(hint) != null;
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	private static class HintAdapter extends ParserHintAdapter {
+
+		/**
+		 * @generated
+		 */
+		private final IElementType elementType;
+
+		/**
+		 * @generated
+		 */
+		public HintAdapter(IElementType type, EObject object, String parserHint) {
+			super(object, parserHint);
+			assert type != null;
+			elementType = type;
+		}
+
+		/**
+		 * @generated
+		 */
+		public Object getAdapter(Class adapter) {
+			if (IElementType.class.equals(adapter)) {
+				return elementType;
+			}
+			return super.getAdapter(adapter);
+		}
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfViewProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfViewProvider.java
new file mode 100644
index 0000000..d4a849a
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/LinklfViewProvider.java
@@ -0,0 +1,683 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EcoreFactory;
+import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
+import org.eclipse.gmf.runtime.common.core.service.IOperation;
+import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
+import org.eclipse.gmf.runtime.diagram.core.providers.IViewProvider;
+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateDiagramViewOperation;
+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateEdgeViewOperation;
+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateNodeViewOperation;
+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateViewForKindOperation;
+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateViewOperation;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
+import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.IHintedType;
+import org.eclipse.gmf.runtime.notation.Connector;
+import org.eclipse.gmf.runtime.notation.DecorationNode;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.FontStyle;
+import org.eclipse.gmf.runtime.notation.Location;
+import org.eclipse.gmf.runtime.notation.MeasurementUnit;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.NotationFactory;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.RelativeBendpoints;
+import org.eclipse.gmf.runtime.notation.Routing;
+import org.eclipse.gmf.runtime.notation.Shape;
+import org.eclipse.gmf.runtime.notation.TitleStyle;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CanvasEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Container2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerContainerCompartment2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerContainerCompartmentEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerName2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.ContainerNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkLinkNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkSourceNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LabeledLinkTargetNameEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.LinkEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.FontData;
+
+/**
+ * @generated
+ */
+public class LinklfViewProvider extends AbstractProvider implements IViewProvider {
+
+	/**
+	 * @generated
+	 */
+	public final boolean provides(IOperation operation) {
+		if (operation instanceof CreateViewForKindOperation) {
+			return provides((CreateViewForKindOperation) operation);
+		}
+		assert operation instanceof CreateViewOperation;
+		if (operation instanceof CreateDiagramViewOperation) {
+			return provides((CreateDiagramViewOperation) operation);
+		} else if (operation instanceof CreateEdgeViewOperation) {
+			return provides((CreateEdgeViewOperation) operation);
+		} else if (operation instanceof CreateNodeViewOperation) {
+			return provides((CreateNodeViewOperation) operation);
+		}
+		return false;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean provides(CreateViewForKindOperation op) {
+		/*
+				if (op.getViewKind() == Node.class)
+					return getNodeViewClass(op.getSemanticAdapter(), op.getContainerView(), op.getSemanticHint()) != null;
+				if (op.getViewKind() == Edge.class)
+					return getEdgeViewClass(op.getSemanticAdapter(), op.getContainerView(), op.getSemanticHint()) != null;
+		*/
+		return true;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean provides(CreateDiagramViewOperation op) {
+		return CanvasEditPart.MODEL_ID.equals(op.getSemanticHint()) && LinklfVisualIDRegistry.getDiagramVisualID(getSemanticElement(op.getSemanticAdapter())) != -1;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean provides(CreateNodeViewOperation op) {
+		if (op.getContainerView() == null) {
+			return false;
+		}
+		IElementType elementType = getSemanticElementType(op.getSemanticAdapter());
+		EObject domainElement = getSemanticElement(op.getSemanticAdapter());
+		int visualID;
+		if (op.getSemanticHint() == null) {
+			// Semantic hint is not specified. Can be a result of call from CanonicalEditPolicy.
+			// In this situation there should be NO elementType, visualID will be determined
+			// by VisualIDRegistry.getNodeVisualID() for domainElement.
+			if (elementType != null || domainElement == null) {
+				return false;
+			}
+			visualID = LinklfVisualIDRegistry.getNodeVisualID(op.getContainerView(), domainElement);
+		} else {
+			visualID = LinklfVisualIDRegistry.getVisualID(op.getSemanticHint());
+			if (elementType != null) {
+				if (!LinklfElementTypes.isKnownElementType(elementType) || (!(elementType instanceof IHintedType))) {
+					return false; // foreign element type
+				}
+				String elementTypeHint = ((IHintedType) elementType).getSemanticHint();
+				if (!op.getSemanticHint().equals(elementTypeHint)) {
+					return false; // if semantic hint is specified it should be the same as in element type
+				}
+				if (domainElement != null && visualID != LinklfVisualIDRegistry.getNodeVisualID(op.getContainerView(), domainElement)) {
+					return false; // visual id for node EClass should match visual id from element type
+				}
+			} else {
+				if (!CanvasEditPart.MODEL_ID.equals(LinklfVisualIDRegistry.getModelID(op.getContainerView()))) {
+					return false; // foreign diagram
+				}
+				switch (visualID) {
+				case CircleEditPart.VISUAL_ID:
+				case RectangleEditPart.VISUAL_ID:
+				case ContainerEditPart.VISUAL_ID:
+				case Rhombus2EditPart.VISUAL_ID:
+				case PortEditPart.VISUAL_ID:
+				case RhombusEditPart.VISUAL_ID:
+				case Circle2EditPart.VISUAL_ID:
+				case Container2EditPart.VISUAL_ID:
+				case Rectangle2EditPart.VISUAL_ID:
+					if (domainElement == null || visualID != LinklfVisualIDRegistry.getNodeVisualID(op.getContainerView(), domainElement)) {
+						return false; // visual id in semantic hint should match visual id for domain element
+					}
+					break;
+				default:
+					return false;
+				}
+			}
+		}
+		return CircleEditPart.VISUAL_ID == visualID || RectangleEditPart.VISUAL_ID == visualID || ContainerEditPart.VISUAL_ID == visualID || RhombusEditPart.VISUAL_ID == visualID
+				|| Circle2EditPart.VISUAL_ID == visualID || Container2EditPart.VISUAL_ID == visualID || Rectangle2EditPart.VISUAL_ID == visualID || Rhombus2EditPart.VISUAL_ID == visualID
+				|| PortEditPart.VISUAL_ID == visualID;
+	}
+
+	/**
+	 * @generated
+	 */
+	protected boolean provides(CreateEdgeViewOperation op) {
+		IElementType elementType = getSemanticElementType(op.getSemanticAdapter());
+		if (!LinklfElementTypes.isKnownElementType(elementType) || (!(elementType instanceof IHintedType))) {
+			return false; // foreign element type
+		}
+		String elementTypeHint = ((IHintedType) elementType).getSemanticHint();
+		if (elementTypeHint == null || (op.getSemanticHint() != null && !elementTypeHint.equals(op.getSemanticHint()))) {
+			return false; // our hint is visual id and must be specified, and it should be the same as in element type
+		}
+		int visualID = LinklfVisualIDRegistry.getVisualID(elementTypeHint);
+		EObject domainElement = getSemanticElement(op.getSemanticAdapter());
+		if (domainElement != null && visualID != LinklfVisualIDRegistry.getLinkWithClassVisualID(domainElement)) {
+			return false; // visual id for link EClass should match visual id from element type
+		}
+		return true;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Diagram createDiagram(IAdaptable semanticAdapter, String diagramKind, PreferencesHint preferencesHint) {
+		Diagram diagram = NotationFactory.eINSTANCE.createDiagram();
+		diagram.getStyles().add(NotationFactory.eINSTANCE.createDiagramStyle());
+		diagram.setType(CanvasEditPart.MODEL_ID);
+		diagram.setElement(getSemanticElement(semanticAdapter));
+		diagram.setMeasurementUnit(MeasurementUnit.PIXEL_LITERAL);
+		return diagram;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Node createNode(IAdaptable semanticAdapter, View containerView, String semanticHint, int index, boolean persisted, PreferencesHint preferencesHint) {
+		final EObject domainElement = getSemanticElement(semanticAdapter);
+		final int visualID;
+		if (semanticHint == null) {
+			visualID = LinklfVisualIDRegistry.getNodeVisualID(containerView, domainElement);
+		} else {
+			visualID = LinklfVisualIDRegistry.getVisualID(semanticHint);
+		}
+		switch (visualID) {
+		case CircleEditPart.VISUAL_ID:
+			return createCircle_2001(domainElement, containerView, index, persisted, preferencesHint);
+		case RectangleEditPart.VISUAL_ID:
+			return createRectangle_2002(domainElement, containerView, index, persisted, preferencesHint);
+		case ContainerEditPart.VISUAL_ID:
+			return createContainer_2003(domainElement, containerView, index, persisted, preferencesHint);
+		case RhombusEditPart.VISUAL_ID:
+			return createRhombus_2004(domainElement, containerView, index, persisted, preferencesHint);
+		case Circle2EditPart.VISUAL_ID:
+			return createCircle_3001(domainElement, containerView, index, persisted, preferencesHint);
+		case Container2EditPart.VISUAL_ID:
+			return createContainer_3002(domainElement, containerView, index, persisted, preferencesHint);
+		case Rectangle2EditPart.VISUAL_ID:
+			return createRectangle_3003(domainElement, containerView, index, persisted, preferencesHint);
+		case Rhombus2EditPart.VISUAL_ID:
+			return createRhombus_3004(domainElement, containerView, index, persisted, preferencesHint);
+		case PortEditPart.VISUAL_ID:
+			return createPort_3005(domainElement, containerView, index, persisted, preferencesHint);
+		}
+		// can't happen, provided #provides(CreateNodeViewOperation) is correct
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Edge createEdge(IAdaptable semanticAdapter, View containerView, String semanticHint, int index, boolean persisted, PreferencesHint preferencesHint) {
+		IElementType elementType = getSemanticElementType(semanticAdapter);
+		String elementTypeHint = ((IHintedType) elementType).getSemanticHint();
+		switch (LinklfVisualIDRegistry.getVisualID(elementTypeHint)) {
+		case LinkEditPart.VISUAL_ID:
+			return createLink_4001(getSemanticElement(semanticAdapter), containerView, index, persisted, preferencesHint);
+		case LabeledLinkEditPart.VISUAL_ID:
+			return createLabeledLink_4002(getSemanticElement(semanticAdapter), containerView, index, persisted, preferencesHint);
+		}
+		// can never happen, provided #provides(CreateEdgeViewOperation) is correct
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Node createCircle_2001(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Shape node = NotationFactory.eINSTANCE.createShape();
+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
+		node.setType(LinklfVisualIDRegistry.getType(CircleEditPart.VISUAL_ID));
+		ViewUtil.insertChildView(containerView, node, index, persisted);
+		node.setElement(domainElement);
+		stampShortcut(containerView, node);
+		// initializeFromPreferences 
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (nodeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			nodeFontStyle.setFontName(fontData.getName());
+			nodeFontStyle.setFontHeight(fontData.getHeight());
+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
+		return node;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Node createRectangle_2002(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Shape node = NotationFactory.eINSTANCE.createShape();
+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
+		node.setType(LinklfVisualIDRegistry.getType(RectangleEditPart.VISUAL_ID));
+		ViewUtil.insertChildView(containerView, node, index, persisted);
+		node.setElement(domainElement);
+		stampShortcut(containerView, node);
+		// initializeFromPreferences 
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (nodeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			nodeFontStyle.setFontName(fontData.getName());
+			nodeFontStyle.setFontHeight(fontData.getHeight());
+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
+		return node;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Node createContainer_2003(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Shape node = NotationFactory.eINSTANCE.createShape();
+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
+		node.setType(LinklfVisualIDRegistry.getType(ContainerEditPart.VISUAL_ID));
+		ViewUtil.insertChildView(containerView, node, index, persisted);
+		node.setElement(domainElement);
+		stampShortcut(containerView, node);
+		// initializeFromPreferences 
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (nodeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			nodeFontStyle.setFontName(fontData.getName());
+			nodeFontStyle.setFontHeight(fontData.getHeight());
+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
+		Node label5002 = createLabel(node, LinklfVisualIDRegistry.getType(ContainerNameEditPart.VISUAL_ID));
+		createCompartment(node, LinklfVisualIDRegistry.getType(ContainerContainerCompartmentEditPart.VISUAL_ID), false, false, false, false);
+		return node;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Node createRhombus_2004(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Shape node = NotationFactory.eINSTANCE.createShape();
+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
+		node.setType(LinklfVisualIDRegistry.getType(RhombusEditPart.VISUAL_ID));
+		ViewUtil.insertChildView(containerView, node, index, persisted);
+		node.setElement(domainElement);
+		stampShortcut(containerView, node);
+		// initializeFromPreferences 
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (nodeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			nodeFontStyle.setFontName(fontData.getName());
+			nodeFontStyle.setFontHeight(fontData.getHeight());
+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
+		return node;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Node createCircle_3001(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Shape node = NotationFactory.eINSTANCE.createShape();
+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
+		node.setType(LinklfVisualIDRegistry.getType(Circle2EditPart.VISUAL_ID));
+		ViewUtil.insertChildView(containerView, node, index, persisted);
+		node.setElement(domainElement);
+		// initializeFromPreferences 
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (nodeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			nodeFontStyle.setFontName(fontData.getName());
+			nodeFontStyle.setFontHeight(fontData.getHeight());
+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
+		return node;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Node createContainer_3002(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Shape node = NotationFactory.eINSTANCE.createShape();
+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
+		node.setType(LinklfVisualIDRegistry.getType(Container2EditPart.VISUAL_ID));
+		ViewUtil.insertChildView(containerView, node, index, persisted);
+		node.setElement(domainElement);
+		// initializeFromPreferences 
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (nodeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			nodeFontStyle.setFontName(fontData.getName());
+			nodeFontStyle.setFontHeight(fontData.getHeight());
+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
+		Node label5001 = createLabel(node, LinklfVisualIDRegistry.getType(ContainerName2EditPart.VISUAL_ID));
+		createCompartment(node, LinklfVisualIDRegistry.getType(ContainerContainerCompartment2EditPart.VISUAL_ID), false, false, false, false);
+		return node;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Node createRectangle_3003(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Shape node = NotationFactory.eINSTANCE.createShape();
+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
+		node.setType(LinklfVisualIDRegistry.getType(Rectangle2EditPart.VISUAL_ID));
+		ViewUtil.insertChildView(containerView, node, index, persisted);
+		node.setElement(domainElement);
+		// initializeFromPreferences 
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (nodeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			nodeFontStyle.setFontName(fontData.getName());
+			nodeFontStyle.setFontHeight(fontData.getHeight());
+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
+		return node;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Node createRhombus_3004(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Shape node = NotationFactory.eINSTANCE.createShape();
+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
+		node.setType(LinklfVisualIDRegistry.getType(Rhombus2EditPart.VISUAL_ID));
+		ViewUtil.insertChildView(containerView, node, index, persisted);
+		node.setElement(domainElement);
+		// initializeFromPreferences 
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (nodeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			nodeFontStyle.setFontName(fontData.getName());
+			nodeFontStyle.setFontHeight(fontData.getHeight());
+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
+		return node;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Node createPort_3005(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Shape node = NotationFactory.eINSTANCE.createShape();
+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
+		node.setType(LinklfVisualIDRegistry.getType(PortEditPart.VISUAL_ID));
+		ViewUtil.insertChildView(containerView, node, index, persisted);
+		node.setElement(domainElement);
+		// initializeFromPreferences 
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle nodeFontStyle = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (nodeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			nodeFontStyle.setFontName(fontData.getName());
+			nodeFontStyle.setFontHeight(fontData.getHeight());
+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FILL_COLOR);
+		ViewUtil.setStructuralFeatureValue(node, NotationPackage.eINSTANCE.getFillStyle_FillColor(), FigureUtilities.RGBToInteger(fillRGB));
+		return node;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Edge createLink_4001(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Connector edge = NotationFactory.eINSTANCE.createConnector();
+		edge.getStyles().add(NotationFactory.eINSTANCE.createFontStyle());
+		RelativeBendpoints bendpoints = NotationFactory.eINSTANCE.createRelativeBendpoints();
+		ArrayList<RelativeBendpoint> points = new ArrayList<RelativeBendpoint>(2);
+		points.add(new RelativeBendpoint());
+		points.add(new RelativeBendpoint());
+		bendpoints.setPoints(points);
+		edge.setBendpoints(bendpoints);
+		ViewUtil.insertChildView(containerView, edge, index, persisted);
+		edge.setType(LinklfVisualIDRegistry.getType(LinkEditPart.VISUAL_ID));
+		edge.setElement(domainElement);
+		// initializePreferences
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(edge, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle edgeFontStyle = (FontStyle) edge.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (edgeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			edgeFontStyle.setFontName(fontData.getName());
+			edgeFontStyle.setFontHeight(fontData.getHeight());
+			edgeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			edgeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			edgeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		Routing routing = Routing.get(prefStore.getInt(IPreferenceConstants.PREF_LINE_STYLE));
+		if (routing != null) {
+			ViewUtil.setStructuralFeatureValue(edge, NotationPackage.eINSTANCE.getRoutingStyle_Routing(), routing);
+		}
+		return edge;
+	}
+
+	/**
+	 * @generated
+	 */
+	public Edge createLabeledLink_4002(EObject domainElement, View containerView, int index, boolean persisted, PreferencesHint preferencesHint) {
+		Connector edge = NotationFactory.eINSTANCE.createConnector();
+		edge.getStyles().add(NotationFactory.eINSTANCE.createFontStyle());
+		RelativeBendpoints bendpoints = NotationFactory.eINSTANCE.createRelativeBendpoints();
+		ArrayList<RelativeBendpoint> points = new ArrayList<RelativeBendpoint>(2);
+		points.add(new RelativeBendpoint());
+		points.add(new RelativeBendpoint());
+		bendpoints.setPoints(points);
+		edge.setBendpoints(bendpoints);
+		ViewUtil.insertChildView(containerView, edge, index, persisted);
+		edge.setType(LinklfVisualIDRegistry.getType(LabeledLinkEditPart.VISUAL_ID));
+		edge.setElement(domainElement);
+		// initializePreferences
+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore();
+
+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_LINE_COLOR);
+		ViewUtil.setStructuralFeatureValue(edge, NotationPackage.eINSTANCE.getLineStyle_LineColor(), FigureUtilities.RGBToInteger(lineRGB));
+		FontStyle edgeFontStyle = (FontStyle) edge.getStyle(NotationPackage.Literals.FONT_STYLE);
+		if (edgeFontStyle != null) {
+			FontData fontData = PreferenceConverter.getFontData(prefStore, IPreferenceConstants.PREF_DEFAULT_FONT);
+			edgeFontStyle.setFontName(fontData.getName());
+			edgeFontStyle.setFontHeight(fontData.getHeight());
+			edgeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);
+			edgeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);
+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);
+			edgeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB).intValue());
+		}
+		Routing routing = Routing.get(prefStore.getInt(IPreferenceConstants.PREF_LINE_STYLE));
+		if (routing != null) {
+			ViewUtil.setStructuralFeatureValue(edge, NotationPackage.eINSTANCE.getRoutingStyle_Routing(), routing);
+		}
+		Node label6001 = createLabel(edge, LinklfVisualIDRegistry.getType(LabeledLinkSourceNameEditPart.VISUAL_ID));
+		label6001.setLayoutConstraint(NotationFactory.eINSTANCE.createLocation());
+		Location location6001 = (Location) label6001.getLayoutConstraint();
+		location6001.setX(0);
+		location6001.setY(40);
+		Node label6002 = createLabel(edge, LinklfVisualIDRegistry.getType(LabeledLinkTargetNameEditPart.VISUAL_ID));
+		label6002.setLayoutConstraint(NotationFactory.eINSTANCE.createLocation());
+		Location location6002 = (Location) label6002.getLayoutConstraint();
+		location6002.setX(0);
+		location6002.setY(60);
+		Node label6003 = createLabel(edge, LinklfVisualIDRegistry.getType(LabeledLinkLinkNameEditPart.VISUAL_ID));
+		label6003.setLayoutConstraint(NotationFactory.eINSTANCE.createLocation());
+		Location location6003 = (Location) label6003.getLayoutConstraint();
+		location6003.setX(0);
+		location6003.setY(80);
+		return edge;
+	}
+
+	/**
+	 * @generated
+	 */
+	private void stampShortcut(View containerView, Node target) {
+		if (!CanvasEditPart.MODEL_ID.equals(LinklfVisualIDRegistry.getModelID(containerView))) {
+			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
+			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
+			shortcutAnnotation.getDetails().put("modelID", CanvasEditPart.MODEL_ID); //$NON-NLS-1$
+			target.getEAnnotations().add(shortcutAnnotation);
+		}
+	}
+
+	/**
+	 * @generated
+	 */
+	private Node createLabel(View owner, String hint) {
+		DecorationNode rv = NotationFactory.eINSTANCE.createDecorationNode();
+		rv.setType(hint);
+		ViewUtil.insertChildView(owner, rv, ViewUtil.APPEND, true);
+		return rv;
+	}
+
+	/**
+	 * @generated
+	 */
+	private Node createCompartment(View owner, String hint, boolean canCollapse, boolean hasTitle, boolean canSort, boolean canFilter) {
+		//SemanticListCompartment rv = NotationFactory.eINSTANCE.createSemanticListCompartment();
+		//rv.setShowTitle(showTitle);
+		//rv.setCollapsed(isCollapsed);
+		Node rv;
+		if (canCollapse) {
+			rv = NotationFactory.eINSTANCE.createBasicCompartment();
+		} else {
+			rv = NotationFactory.eINSTANCE.createDecorationNode();
+		}
+		if (hasTitle) {
+			TitleStyle ts = NotationFactory.eINSTANCE.createTitleStyle();
+			ts.setShowTitle(true);
+			rv.getStyles().add(ts);
+		}
+		if (canSort) {
+			rv.getStyles().add(NotationFactory.eINSTANCE.createSortingStyle());
+		}
+		if (canFilter) {
+			rv.getStyles().add(NotationFactory.eINSTANCE.createFilteringStyle());
+		}
+		rv.setType(hint);
+		ViewUtil.insertChildView(owner, rv, ViewUtil.APPEND, true);
+		return rv;
+	}
+
+	/**
+	 * @generated
+	 */
+	private EObject getSemanticElement(IAdaptable semanticAdapter) {
+		if (semanticAdapter == null) {
+			return null;
+		}
+		EObject eObject = (EObject) semanticAdapter.getAdapter(EObject.class);
+		if (eObject != null) {
+			return EMFCoreUtil.resolve(TransactionUtil.getEditingDomain(eObject), eObject);
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	private IElementType getSemanticElementType(IAdaptable semanticAdapter) {
+		if (semanticAdapter == null) {
+			return null;
+		}
+		return (IElementType) semanticAdapter.getAdapter(IElementType.class);
+	}
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfCanvasEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfCanvasEditPart.java
new file mode 100644
index 0000000..80348e7
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfCanvasEditPart.java
@@ -0,0 +1,29 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfModelingAssistantProvider;
+
+/**
+	 * @generated
+	 */
+public class LinklfModelingAssistantProviderOfCanvasEditPart extends LinklfModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForPopupBar(IAdaptable host) {
+		List<IElementType> types = new ArrayList<IElementType>(4);
+		types.add(LinklfElementTypes.Circle_2001);
+		types.add(LinklfElementTypes.Rectangle_2002);
+		types.add(LinklfElementTypes.Container_2003);
+		types.add(LinklfElementTypes.Rhombus_2004);
+		return types;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfCircle2EditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfCircle2EditPart.java
new file mode 100644
index 0000000..8c95b5c
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfCircle2EditPart.java
@@ -0,0 +1,191 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfModelingAssistantProvider;
+
+/**
+	 * @generated
+	 */
+public class LinklfModelingAssistantProviderOfCircle2EditPart extends LinklfModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSource(IAdaptable source) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSource((Circle2EditPart) sourceEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSource(Circle2EditPart source) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSourceAndTarget(IAdaptable source, IAdaptable target) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSourceAndTarget((Circle2EditPart) sourceEditPart, targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSourceAndTarget(Circle2EditPart source, IGraphicalEditPart targetEditPart) {
+		List<IElementType> types = new LinkedList<IElementType>();
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForTarget(IAdaptable source, IElementType relationshipType) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForTarget((Circle2EditPart) sourceEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForTarget(Circle2EditPart source, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnTarget(IAdaptable target) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnTarget((Circle2EditPart) targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnTarget(Circle2EditPart target) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForSource(IAdaptable target, IElementType relationshipType) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForSource((Circle2EditPart) targetEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForSource(Circle2EditPart target, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfCircleEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfCircleEditPart.java
new file mode 100644
index 0000000..0bde9ac
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfCircleEditPart.java
@@ -0,0 +1,191 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfModelingAssistantProvider;
+
+/**
+	 * @generated
+	 */
+public class LinklfModelingAssistantProviderOfCircleEditPart extends LinklfModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSource(IAdaptable source) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSource((CircleEditPart) sourceEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSource(CircleEditPart source) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSourceAndTarget(IAdaptable source, IAdaptable target) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSourceAndTarget((CircleEditPart) sourceEditPart, targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSourceAndTarget(CircleEditPart source, IGraphicalEditPart targetEditPart) {
+		List<IElementType> types = new LinkedList<IElementType>();
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForTarget(IAdaptable source, IElementType relationshipType) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForTarget((CircleEditPart) sourceEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForTarget(CircleEditPart source, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnTarget(IAdaptable target) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnTarget((CircleEditPart) targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnTarget(CircleEditPart target) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForSource(IAdaptable target, IElementType relationshipType) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForSource((CircleEditPart) targetEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForSource(CircleEditPart target, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfContainer2EditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfContainer2EditPart.java
new file mode 100644
index 0000000..159547e
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfContainer2EditPart.java
@@ -0,0 +1,26 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfModelingAssistantProvider;
+
+/**
+	 * @generated
+	 */
+public class LinklfModelingAssistantProviderOfContainer2EditPart extends LinklfModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForPopupBar(IAdaptable host) {
+		List<IElementType> types = new ArrayList<IElementType>(1);
+		types.add(LinklfElementTypes.Port_3005);
+		return types;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfContainerEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfContainerEditPart.java
new file mode 100644
index 0000000..b2b6ff9
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfContainerEditPart.java
@@ -0,0 +1,26 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfModelingAssistantProvider;
+
+/**
+	 * @generated
+	 */
+public class LinklfModelingAssistantProviderOfContainerEditPart extends LinklfModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForPopupBar(IAdaptable host) {
+		List<IElementType> types = new ArrayList<IElementType>(1);
+		types.add(LinklfElementTypes.Port_3005);
+		return types;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfPortEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfPortEditPart.java
new file mode 100644
index 0000000..3673070
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfPortEditPart.java
@@ -0,0 +1,191 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfModelingAssistantProvider;
+
+/**
+	 * @generated
+	 */
+public class LinklfModelingAssistantProviderOfPortEditPart extends LinklfModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSource(IAdaptable source) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSource((PortEditPart) sourceEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSource(PortEditPart source) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSourceAndTarget(IAdaptable source, IAdaptable target) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSourceAndTarget((PortEditPart) sourceEditPart, targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSourceAndTarget(PortEditPart source, IGraphicalEditPart targetEditPart) {
+		List<IElementType> types = new LinkedList<IElementType>();
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForTarget(IAdaptable source, IElementType relationshipType) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForTarget((PortEditPart) sourceEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForTarget(PortEditPart source, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnTarget(IAdaptable target) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnTarget((PortEditPart) targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnTarget(PortEditPart target) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForSource(IAdaptable target, IElementType relationshipType) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForSource((PortEditPart) targetEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForSource(PortEditPart target, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRectangle2EditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRectangle2EditPart.java
new file mode 100644
index 0000000..76f79c8
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRectangle2EditPart.java
@@ -0,0 +1,191 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfModelingAssistantProvider;
+
+/**
+	 * @generated
+	 */
+public class LinklfModelingAssistantProviderOfRectangle2EditPart extends LinklfModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSource(IAdaptable source) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSource((Rectangle2EditPart) sourceEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSource(Rectangle2EditPart source) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSourceAndTarget(IAdaptable source, IAdaptable target) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSourceAndTarget((Rectangle2EditPart) sourceEditPart, targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSourceAndTarget(Rectangle2EditPart source, IGraphicalEditPart targetEditPart) {
+		List<IElementType> types = new LinkedList<IElementType>();
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForTarget(IAdaptable source, IElementType relationshipType) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForTarget((Rectangle2EditPart) sourceEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForTarget(Rectangle2EditPart source, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnTarget(IAdaptable target) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnTarget((Rectangle2EditPart) targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnTarget(Rectangle2EditPart target) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForSource(IAdaptable target, IElementType relationshipType) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForSource((Rectangle2EditPart) targetEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForSource(Rectangle2EditPart target, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRectangleEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRectangleEditPart.java
new file mode 100644
index 0000000..d2a7529
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRectangleEditPart.java
@@ -0,0 +1,191 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfModelingAssistantProvider;
+
+/**
+	 * @generated
+	 */
+public class LinklfModelingAssistantProviderOfRectangleEditPart extends LinklfModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSource(IAdaptable source) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSource((RectangleEditPart) sourceEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSource(RectangleEditPart source) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSourceAndTarget(IAdaptable source, IAdaptable target) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSourceAndTarget((RectangleEditPart) sourceEditPart, targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSourceAndTarget(RectangleEditPart source, IGraphicalEditPart targetEditPart) {
+		List<IElementType> types = new LinkedList<IElementType>();
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForTarget(IAdaptable source, IElementType relationshipType) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForTarget((RectangleEditPart) sourceEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForTarget(RectangleEditPart source, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnTarget(IAdaptable target) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnTarget((RectangleEditPart) targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnTarget(RectangleEditPart target) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForSource(IAdaptable target, IElementType relationshipType) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForSource((RectangleEditPart) targetEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForSource(RectangleEditPart target, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRhombus2EditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRhombus2EditPart.java
new file mode 100644
index 0000000..e513061
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRhombus2EditPart.java
@@ -0,0 +1,191 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfModelingAssistantProvider;
+
+/**
+	 * @generated
+	 */
+public class LinklfModelingAssistantProviderOfRhombus2EditPart extends LinklfModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSource(IAdaptable source) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSource((Rhombus2EditPart) sourceEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSource(Rhombus2EditPart source) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSourceAndTarget(IAdaptable source, IAdaptable target) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSourceAndTarget((Rhombus2EditPart) sourceEditPart, targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSourceAndTarget(Rhombus2EditPart source, IGraphicalEditPart targetEditPart) {
+		List<IElementType> types = new LinkedList<IElementType>();
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForTarget(IAdaptable source, IElementType relationshipType) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForTarget((Rhombus2EditPart) sourceEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForTarget(Rhombus2EditPart source, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnTarget(IAdaptable target) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnTarget((Rhombus2EditPart) targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnTarget(Rhombus2EditPart target) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForSource(IAdaptable target, IElementType relationshipType) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForSource((Rhombus2EditPart) targetEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForSource(Rhombus2EditPart target, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRhombusEditPart.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRhombusEditPart.java
new file mode 100644
index 0000000..5a52ffb
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/providers/assistants/LinklfModelingAssistantProviderOfRhombusEditPart.java
@@ -0,0 +1,191 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.providers.assistants;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Circle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.CircleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.PortEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rectangle2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RectangleEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.Rhombus2EditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts.RhombusEditPart;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfModelingAssistantProvider;
+
+/**
+	 * @generated
+	 */
+public class LinklfModelingAssistantProviderOfRhombusEditPart extends LinklfModelingAssistantProvider {
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSource(IAdaptable source) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSource((RhombusEditPart) sourceEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSource(RhombusEditPart source) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnSourceAndTarget(IAdaptable source, IAdaptable target) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnSourceAndTarget((RhombusEditPart) sourceEditPart, targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnSourceAndTarget(RhombusEditPart source, IGraphicalEditPart targetEditPart) {
+		List<IElementType> types = new LinkedList<IElementType>();
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.Link_4001);
+		}
+		if (targetEditPart instanceof CircleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RectangleEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof RhombusEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Circle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rectangle2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof Rhombus2EditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		if (targetEditPart instanceof PortEditPart) {
+			types.add(LinklfElementTypes.LabeledLink_4002);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForTarget(IAdaptable source, IElementType relationshipType) {
+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForTarget((RhombusEditPart) sourceEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForTarget(RhombusEditPart source, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getRelTypesOnTarget(IAdaptable target) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetRelTypesOnTarget((RhombusEditPart) targetEditPart);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetRelTypesOnTarget(RhombusEditPart target) {
+		List<IElementType> types = new ArrayList<IElementType>(2);
+		types.add(LinklfElementTypes.Link_4001);
+		types.add(LinklfElementTypes.LabeledLink_4002);
+		return types;
+	}
+
+	/**
+	 * @generated
+	 */
+	@Override
+	public List<IElementType> getTypesForSource(IAdaptable target, IElementType relationshipType) {
+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target.getAdapter(IGraphicalEditPart.class);
+		return doGetTypesForSource((RhombusEditPart) targetEditPart, relationshipType);
+	}
+
+	/**
+	 * @generated
+	 */
+	public List<IElementType> doGetTypesForSource(RhombusEditPart target, IElementType relationshipType) {
+		List<IElementType> types = new ArrayList<IElementType>();
+		if (relationshipType == LinklfElementTypes.Link_4001) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		} else if (relationshipType == LinklfElementTypes.LabeledLink_4002) {
+			types.add(LinklfElementTypes.Circle_2001);
+			types.add(LinklfElementTypes.Rectangle_2002);
+			types.add(LinklfElementTypes.Rhombus_2004);
+			types.add(LinklfElementTypes.Circle_3001);
+			types.add(LinklfElementTypes.Rectangle_3003);
+			types.add(LinklfElementTypes.Rhombus_3004);
+			types.add(LinklfElementTypes.Port_3005);
+		}
+		return types;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/sheet/LinklfPropertySection.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/sheet/LinklfPropertySection.java
new file mode 100644
index 0000000..8182a90
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/sheet/LinklfPropertySection.java
@@ -0,0 +1,21 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.sheet;
+
+import org.eclipse.gmf.tooling.runtime.sheet.DefaultPropertySection;
+import org.eclipse.ui.views.properties.IPropertySourceProvider;
+
+/**
+ * @generated
+ */
+public class LinklfPropertySection extends DefaultPropertySection implements IPropertySourceProvider {
+
+	/**
+	 * Modify/unwrap selection.
+	 * @generated
+	 */
+	@Override
+	protected Object transformSelection(Object selected) {
+		selected = /*super.*/transformSelectionToDomain(selected);
+		return selected;
+	}
+
+}
diff --git a/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/sheet/LinklfSheetLabelProvider.java b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/sheet/LinklfSheetLabelProvider.java
new file mode 100644
index 0000000..7614e99
--- /dev/null
+++ b/test-examples/linklf/xtend-external/org.eclipse.gmf.tooling.examples.linklf.diagram/src/org/eclipse/gmf/tooling/examples/linklf/diagram/sheet/LinklfSheetLabelProvider.java
@@ -0,0 +1,78 @@
+package org.eclipse.gmf.tooling.examples.linklf.diagram.sheet;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.navigator.LinklfNavigatorGroup;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.part.LinklfVisualIDRegistry;
+import org.eclipse.gmf.tooling.examples.linklf.diagram.providers.LinklfElementTypes;
+import org.eclipse.jface.viewers.BaseLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @generated
+ */
+public class LinklfSheetLabelProvider extends BaseLabelProvider implements ILabelProvider {
+
+	/**
+	 * @generated
+	 */
+	public String getText(Object element) {
+		element = unwrap(element);
+		if (element instanceof LinklfNavigatorGroup) {
+			return ((LinklfNavigatorGroup) element).getGroupName();
+		}
+		IElementType etype = getElementType(getView(element));
+		return etype == null ? "" : etype.getDisplayName();
+	}
+
+	/**
+	 * @generated
+	 */
+	public Image getImage(Object element) {
+		IElementType etype = getElementType(getView(unwrap(element)));
+		return etype == null ? null : LinklfElementTypes.getImage(etype);
+	}
+
+	/**
+	 * @generated
+	 */
+	private Object unwrap(Object element) {
+		if (element instanceof IStructuredSelection) {
+			return ((IStructuredSelection) element).getFirstElement();
+		}
+		return element;
+	}
+
+	/**
+	 * @generated
+	 */
+	private View getView(Object element) {
+		if (element instanceof View) {
+			return (View) element;
+		}
+		if (element instanceof IAdaptable) {
+			return (View) ((IAdaptable) element).getAdapter(View.class);
+		}
+		return null;
+	}
+
+	/**
+	 * @generated
+	 */
+	private IElementType getElementType(View view) {
+		// For intermediate views climb up the containment hierarchy to find the one associated with an element type.
+		while (view != null) {
+			int vid = LinklfVisualIDRegistry.getVisualID(view);
+			IElementType etype = LinklfElementTypes.getElementType(vid);
+			if (etype != null) {
+				return etype;
+			}
+			view = view.eContainer() instanceof View ? (View) view.eContainer() : null;
+		}
+		return null;
+	}
+
+}
