LinkLF sample (external activation of LinkLF): regenerated without
custom code 

Change-Id: Ib88585a46b96160ebd864bf7d46184bdcfcf56d8
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;
+	}
+
+}