bug 333886: add port of tabbed properties view to CVS
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/.classpath b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.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/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/.cvsignore b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.cvsignore
new file mode 100644
index 0000000..f0a691e
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.cvsignore
@@ -0,0 +1,2 @@
+bin
+doc
\ No newline at end of file
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/.project b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.project
new file mode 100644
index 0000000..cade9af
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.rap.ui.views.properties.tabbed</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>
+		<buildCommand>
+			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..e628e46
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,355 @@
+#Thu Dec 08 15:03:48 CET 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=error
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=82
+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=82
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=82
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=82
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=50
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=52
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=51
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=52
+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=82
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=82
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=84
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=36
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=36
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=36
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=36
+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=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=1
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=0
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=0
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=0
+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=next_line_on_wrap
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=next_line_on_wrap
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line_on_wrap
+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_method_declaration=next_line_on_wrap
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line_on_wrap
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=true
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+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=do not 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=false
+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=true
+org.eclipse.jdt.core.formatter.indentation.size=2
+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_member=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=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=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=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_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_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=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=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=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=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=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=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_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=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=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=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=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=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=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_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=do not 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=do not 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=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=do not 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=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=do not 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_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=100
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=0
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=2
+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_outer_expressions_when_nested=true
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a4dbd1f
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,9 @@
+#Tue May 31 10:36:40 CEST 2011
+eclipse.preferences.version=1
+formatter_profile=_RAP
+formatter_settings_version=11
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment"/><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment"/><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment"/><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user} */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment"/><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment"/><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) ${year} EclipseSource and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *    EclipseSource - initial API and implementation\n ******************************************************************************/\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..d8e8469
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,14 @@
+#Tue Nov 16 14:12:29 EST 2004
+compilers.p.unused-element-or-attribute=1
+compilers.p.unresolved-ex-points=0
+compilers.p.deprecated=0
+compilers.p.unknown-element=1
+compilers.p.unknown-resource=1
+compilers.p.unknown-class=1
+compilers.p.unknown-attribute=0
+compilers.p.no-required-att=0
+eclipse.preferences.version=1
+compilers.p.unresolved-import=0
+compilers.p.not-externalized-att=0
+compilers.p.illegal-att-value=0
+compilers.use-project=true
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/META-INF/MANIFEST.MF b/bundles/org.eclipse.rap.ui.views.properties.tabbed/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3dec1c3
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Plugin.name
+Bundle-SymbolicName: org.eclipse.rap.ui.views.properties.tabbed;singleton:=true
+Bundle-Version: 1.5.0.qualifier
+Bundle-Activator: org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewPlugin
+Bundle-Vendor: %Plugin.providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.ui.internal.views.properties.tabbed;x-internal:=true,
+ org.eclipse.ui.internal.views.properties.tabbed.l10n;x-internal:=true,
+ org.eclipse.ui.internal.views.properties.tabbed.view;x-internal:=true,
+ org.eclipse.ui.views.properties.tabbed
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.rap.ui;bundle-version="1.4.0",
+ org.eclipse.rap.ui.forms;bundle-version="1.4.0",
+ org.eclipse.rap.ui.views;bundle-version="1.4.0"
+Import-Package: com.ibm.icu.text
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/about.html b/bundles/org.eclipse.rap.ui.views.properties.tabbed/about.html
new file mode 100644
index 0000000..4602330
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/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 2, 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/bundles/org.eclipse.rap.ui.views.properties.tabbed/build.properties b/bundles/org.eclipse.rap.ui.views.properties.tabbed/build.properties
new file mode 100644
index 0000000..a4efc20
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2001, 2006 IBM Corporation and others.
+# 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
+# 
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               plugin.properties,\
+               .,\
+               META-INF/,\
+               about.html
+src.includes = about.html,\
+               schema/
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/plugin.properties b/bundles/org.eclipse.rap.ui.views.properties.tabbed/plugin.properties
new file mode 100644
index 0000000..be38cad
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/plugin.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2001, 2006 IBM Corporation and others.
+# 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
+# 
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+Plugin.name = Tabbed Properties View
+Plugin.providerName = Eclipse.org
+
+ExtPoint.propertyContributor = Property Contributor
+ExtPoint.propertyTabs = Property Tabs
+ExtPoint.propertySections = Property Sections
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/plugin.xml b/bundles/org.eclipse.rap.ui.views.properties.tabbed/plugin.xml
new file mode 100644
index 0000000..70cecda
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/plugin.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+
+   <extension-point id="org.eclipse.ui.views.properties.tabbed.propertyContributor" name="%ExtPoint.propertyContributor" schema="schema/propertyContributor.exsd"/>
+   <extension-point id="org.eclipse.ui.views.properties.tabbed.propertyTabs" name="%ExtPoint.propertyTabs" schema="schema/propertyTabs.exsd"/>
+   <extension-point id="org.eclipse.ui.views.properties.tabbed.propertySections" name="%ExtPoint.propertySections" schema="schema/propertySections.exsd"/>
+
+</plugin>
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/schema/propertyContributor.exsd b/bundles/org.eclipse.rap.ui.views.properties.tabbed/schema/propertyContributor.exsd
new file mode 100644
index 0000000..21166c6
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/schema/propertyContributor.exsd
@@ -0,0 +1,188 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.ui.views.properties.tabbed">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.ui.views.properties.tabbed" id="propertyContributor" name="Property Contributor"/>
+      </appInfo>
+      <documentation>
+         Describes a workbench part that is a contributor of properties to be displayed within tabs in the tabbed property sheet page.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="propertyContributor"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="propertyContributor">
+      <complexType>
+         <sequence>
+            <element ref="propertyCategory" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="contributorId" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The unique identifier of the property sheet page contributor.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="typeMapper" type="string">
+            <annotation>
+               <documentation>
+                  The class that implements the type mapper, i.e. implements &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.ITypeMapper&lt;/tt&gt;
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.properties.tabbed.ITypeMapper"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="labelProvider" type="string">
+            <annotation>
+               <documentation>
+                  The class that implements the label provider for the title for the property sheet page, i.e. implements &lt;tt&gt;org.eclipse.jface.viewers.ILabelProvider&lt;/tt&gt;
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.jface.viewers.ILabelProvider"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="actionProvider" type="string">
+            <annotation>
+               <documentation>
+                  The class that implements the action provider for the property sheet page, i.e. implements &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.IActionProvider&lt;/tt&gt;
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.properties.tabbed.IActionProvider"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="sectionDescriptorProvider" type="string">
+            <annotation>
+               <documentation>
+                  The class that implements the section descriptor provider for the property sheet page, i.e. implements &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider&lt;/tt&gt;
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="tabDescriptorProvider" type="string">
+            <annotation>
+               <documentation>
+                  The class that implements the tab descriptor provider for the property sheet page, i.e. implements &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider&lt;/tt&gt;
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="overridableTabListContentProvider" type="boolean">
+            <annotation>
+               <documentation>
+                  If true then this contributor will override the list of tabs by using sections that extend &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.AbstractOverridableTabListPropertySection&lt;/tt&gt;
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="propertyCategory">
+      <complexType>
+         <attribute name="category" type="string">
+            <annotation>
+               <documentation>
+                  A category used to group tabs.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;pre&gt;
+   &lt;extension
+         point=&quot;org.eclipse.ui.views.properties.tabbed.propertyContributor&quot;&gt;
+      &lt;propertyContributor
+            contributorId=&quot;org.eclipse.ui.tests.views.properties.tabbed.views.TestsView&quot;
+            labelProvider=&quot;org.eclipse.ui.tests.views.properties.tabbed.views.LabelProvider&quot;
+            typeMapper=&quot;org.eclipse.ui.tests.views.properties.tabbed.views.TypeMapper&quot;&gt;
+         &lt;propertyCategory category=&quot;first&quot;&gt;
+         &lt;/propertyCategory&gt;
+         &lt;propertyCategory category=&quot;second&quot;&gt;
+         &lt;/propertyCategory&gt;
+      &lt;/propertyContributor&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
+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 &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/schema/propertySections.exsd b/bundles/org.eclipse.rap.ui.views.properties.tabbed/schema/propertySections.exsd
new file mode 100644
index 0000000..bd77cfc
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/schema/propertySections.exsd
@@ -0,0 +1,201 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.ui.views.properties.tabbed">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.ui.views.properties.tabbed" id="propertySections" name="Property Sections"/>
+      </appInfo>
+      <documentation>
+         Describes a list of sections to be displayed within tabs that will be contributed to the tabbed property sheet page.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="propertySections"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="propertySections">
+      <complexType>
+         <sequence>
+            <element ref="propertySection" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="contributorId" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The unique identifier of the property sheet page contributor.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="propertySection">
+      <complexType>
+         <sequence>
+            <element ref="input" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="tab" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The tab in which this section appears.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The unique id for the section.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The class that implements the section, i.e. extends &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.AbstractPropertySection&lt;/tt&gt;
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.properties.tabbed.AbstractPropertySection"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="afterSection" type="string">
+            <annotation>
+               <documentation>
+                  When there is more than one section in a tab, sections are sorted by the afterSection attribute.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="filter" type="string">
+            <annotation>
+               <documentation>
+                  The class that implements a section filter, i.e. implements &lt;tt&gt;org.eclipse.jface.viewers.IFilter&lt;/tt&gt;.
+A filter is used to override the type mapper and input for the selection. When a filter is specified, type mapper and input are ignored.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.jface.viewers.IFilter"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="enablesFor" type="string">
+            <annotation>
+               <documentation>
+                  a value indicating the selection count which must be met to enable the section. If specified and the condition is not met, the section is not displayed. If omitted, the section enablement is not affected. The following attribute formats are currently supported: 
+    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
+      &lt;tr&gt;
+ &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
+        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;n&lt;/b&gt;&lt;/td&gt;
+        &lt;td valign=&quot;top&quot;&gt;- a precise number of items selected.&amp;nbsp;
+          For example: enablesFor=&amp;quot; 1&amp;quot; enables the section only when 1
+          item is selected&lt;/td&gt;
+      &lt;/tr&gt;
+    &lt;/table&gt;
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="input">
+      <complexType>
+         <attribute name="type" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The selected class or interface that will enable the display on the section in the tab.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;pre&gt;
+   &lt;extension
+         point=&quot;org.eclipse.ui.tests.views.properties.tabbed.propertySections&quot;&gt;
+      &lt;propertySections contributorId=&quot;org.eclipse.ui.views.properties.tabbed.views.TestsView&quot;&gt;
+         &lt;propertySection
+               class=&quot;org.eclipse.ui.tests.views.properties.tabbed.sections.NameSection&quot;
+               enablesFor=&quot;1&quot;
+               id=&quot;propertySection1&quot;
+               tab=&quot;propertyTab1&quot;&gt;
+            &lt;input type=&quot;org.eclipse.ui.tests.views.properties.tabbed.model.Element&quot;&gt;
+            &lt;/input&gt;
+         &lt;/propertySection&gt;
+      &lt;/propertySections&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
+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 &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/schema/propertyTabs.exsd b/bundles/org.eclipse.rap.ui.views.properties.tabbed/schema/propertyTabs.exsd
new file mode 100644
index 0000000..63bcd13
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/schema/propertyTabs.exsd
@@ -0,0 +1,162 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.ui.views.properties.tabbed" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.ui.views.properties.tabbed" id="propertyTabs" name="Property Tabs"/>
+      </appinfo>
+      <documentation>
+         Describes a list of tabs that will be contributed to the tabbed property sheet page.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="propertyTabs"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="propertyTabs">
+      <complexType>
+         <sequence>
+            <element ref="propertyTab" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="contributorId" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The unique identifier of the property sheet page contributor.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="propertyTab">
+      <complexType>
+         <attribute name="label" type="string" use="required">
+         	<annotation>
+            	<appInfo>
+                  <meta.attribute translatable="true"/>
+               	</appInfo>
+               <documentation>
+                  The label to be displayed on the tab.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="category" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The category used to group tabs.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="afterTab" type="string">
+            <annotation>
+               <documentation>
+                  When there is more than one tab in a category, tabs are sorted by the afterTab attribute.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The unique id for the tab.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="indented" type="boolean">
+            <annotation>
+               <documentation>
+                  If &lt;code&gt;true&lt;/code&gt;, then this tab is idented. This is meant to indicate subtabs or categories of the parent tab.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="image" type="string">
+            <annotation>
+               <documentation>
+                  If an image is provided, the icon image is displayed on the tab when the tab is active.
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="resource"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+
+   <annotation>
+      <appinfo>
+         <meta.section type="examples"/>
+      </appinfo>
+      <documentation>
+         &lt;pre&gt;
+   &lt;extension
+         point=&quot;org.eclipse.ui.views.properties.tabbed.propertyTabs&quot;&gt;
+      &lt;propertyTabs contributorId=&quot;org.eclipse.ui.tests.views.properties.tabbed.views.TestsView&quot;&gt;
+         &lt;propertyTab
+               category=&quot;first&quot;
+               id=&quot;propertyTab1&quot;
+               label=&quot;Name&quot;&gt;
+         &lt;/propertyTab&gt;
+         &lt;propertyTab
+               afterTab=&quot;propertyTab1&quot;
+               category=&quot;first&quot;
+               id=&quot;propertyTab2&quot;
+               label=&quot;Project&quot;&gt;
+         &lt;/propertyTab&gt;
+         &lt;propertyTab
+               category=&quot;second&quot;
+               id=&quot;propertyTab8&quot;
+               label=&quot;Message&quot;&gt;
+         &lt;/propertyTab&gt;
+      &lt;/propertyTabs&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+
+
+   <annotation>
+      <appinfo>
+         <meta.section type="copyright"/>
+      </appinfo>
+      <documentation>
+         Copyright (c) 2005, 2008 IBM Corporation and others.&lt;br&gt;
+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 &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewPlugin.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewPlugin.java
new file mode 100644
index 0000000..0f1447f
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewPlugin.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * The common ui properties plug-in.
+ * 
+ * @author Anthony Hunter
+ */
+public class TabbedPropertyViewPlugin
+	extends AbstractUIPlugin {
+
+	private static TabbedPropertyViewPlugin plugin;
+
+    /**
+     * Constructor for TabbedPropertyViewPlugin.
+     */
+	public TabbedPropertyViewPlugin() {
+		super();
+		plugin = this;
+	}
+
+    /**
+     * Retrieve the plug-in class for this plug-in.
+     * @return the plug-in class for this plug-in.
+     */
+	public static TabbedPropertyViewPlugin getPlugin() {
+		return plugin;
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewStatusCodes.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewStatusCodes.java
new file mode 100644
index 0000000..eafad48
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewStatusCodes.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed;
+
+/**
+ * A list of status codes for this plug-in.
+ * 
+ * @author Anthony Hunter
+ */
+public final class TabbedPropertyViewStatusCodes {
+
+	/**
+	 * This class should not be instantiated since it is a static constant
+	 * class.
+	 */
+	private TabbedPropertyViewStatusCodes() {
+		/* not used */
+	}
+
+	/**
+	 * Status code indicating that everything is OK.
+	 */
+	public static final int OK = 0;
+
+	/**
+	 * Status code indicating that a tab was not found for the given tab id.
+	 */
+	public static final int NO_TAB_ERROR = 1;
+
+	/**
+	 * Status code indicating that issue was found loading the section extension
+	 * configuration element.
+	 */
+	public static final int SECTION_ERROR = 2;
+
+	/**
+	 * Status code indicating that issue was found loading the tab extension
+	 * configuration element.
+	 */
+	public static final int TAB_ERROR = 3;
+
+	/**
+	 * Status code indicating that issue was found loading the contributor
+	 * extension configuration element.
+	 */
+	public static final int CONTRIBUTOR_ERROR = 4;
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.java
new file mode 100644
index 0000000..e0af002
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.l10n;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Message Bundle class for the tabbed properties view plug-in.
+ * 
+ * @author Anthony Hunter
+ * 
+ */
+public final class TabbedPropertyMessages
+	extends NLS {
+
+	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.views.properties.tabbed.l10n.TabbedPropertyMessages";//$NON-NLS-1$
+
+	/**
+	 * Constructor for TabbedPropertyMessages.
+	 */
+	private TabbedPropertyMessages() {
+		// private constructor
+	}
+
+    /**
+     * Message when a property section extension is in error.
+     */
+	public static String SectionDescriptor_Section_error;
+
+	/**
+     * Message when a property section extension causes a class not found exception.
+     */
+	public static String SectionDescriptor_class_not_found_error;
+	
+    /**
+     * Message when a property tab extension is in error.
+     */
+	public static String TabDescriptor_Tab_error;
+
+    /**
+     * Message when a property tab extension has an unknown category.
+     */
+	public static String TabDescriptor_Tab_unknown_category;
+
+    /**
+     * Message when a non existing tab is found in a property section extension.
+     */
+	public static String TabbedPropertyRegistry_Non_existing_tab;
+
+    /**
+     * Message when a property contributor extension is in error.
+     */
+	public static String TabbedPropertyRegistry_contributor_error;
+
+    /**
+     * No properties available message.
+     */
+	public static String TabbedPropertyList_properties_not_available;
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, TabbedPropertyMessages.class);
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.properties b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.properties
new file mode 100644
index 0000000..01c6477
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2001, 2008 IBM Corporation and others.
+# 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
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+SectionDescriptor_Section_error=Section in {0} must provide an id and a tab.
+SectionDescriptor_class_not_found_error=Section {0} declares non-existing filter or section class.
+TabDescriptor_Tab_error=Tab in {0} must provide an id, label and category.
+TabDescriptor_Tab_unknown_category=Tab in {0} declares non-existing category {1}.
+TabbedPropertyRegistry_Non_existing_tab=Section {0} declares non-existing tab {1}.
+TabbedPropertyRegistry_contributor_error=Contributor {0} cannot be created.
+TabbedPropertyList_properties_not_available=Properties are not available.
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/OverridableTabListContentProvider.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/OverridableTabListContentProvider.java
new file mode 100644
index 0000000..dc85ced
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/OverridableTabListContentProvider.java
@@ -0,0 +1,287 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import org.eclipse.core.runtime.Assert;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.IContributedContentsView;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.AbstractOverridableTabListPropertySection;
+import org.eclipse.ui.views.properties.tabbed.IOverridableTabListContentProvider;
+import org.eclipse.ui.views.properties.tabbed.ISection;
+import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
+import org.eclipse.ui.views.properties.tabbed.ITabItem;
+import org.eclipse.ui.views.properties.tabbed.ITabSelectionListener;
+import org.eclipse.ui.views.properties.tabbed.TabContents;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+
+/**
+ * An extended implementation of the content provider for the tabbed property
+ * sheet page's list of tabs.
+ * <p>
+ * This implementation allows the section to override the list of what tabs are
+ * displayed, rather than using the default list of tabs from the tabbed
+ * property registry.
+ * 
+ * @author Anthony Hunter
+ * @since 3.4
+ */
+class OverridableTabListContentProvider extends TabListContentProvider
+		implements IOverridableTabListContentProvider, ITabSelectionListener {
+
+	/**
+	 * Constructor for OverrideTabListContentProvider.
+	 * 
+	 * @param registry
+	 *            the tabbed property registry.
+	 */
+	public OverridableTabListContentProvider(TabbedPropertyRegistry registry) {
+		super(registry);
+	}
+
+	private TabbedPropertySheetPage tabbedPropertySheetPage;
+
+	private TabbedPropertyViewer tabbedPropertyViewer;
+
+	/**
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object inputElement) {
+		if (tabbedPropertySheetPage.getCurrentTab() == null) {
+			/*
+			 * In this case, return the default list of tabs from the registry.
+			 * The contributor will not have had a chance to load and override
+			 * the tabs.
+			 */
+			return registry.getTabDescriptors(currentPart,
+					(ISelection) inputElement);
+		}
+		return getOverrideTabs(inputElement);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.internal.views.properties.tabbed.view.TabListContentProvider#dispose()
+	 */
+	public void dispose() {
+		stopListening();
+		this.tabbedPropertyViewer = null;
+		this.currentPart = null;
+		this.tabbedPropertySheetPage = null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.internal.views.properties.tabbed.view.TabListContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
+	 *      java.lang.Object, java.lang.Object)
+	 */
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		if (tabbedPropertyViewer == null) {
+			Assert.isTrue(viewer instanceof TabbedPropertyViewer);
+			init((TabbedPropertyViewer) viewer);
+		}
+	}
+
+	/**
+	 * Initialize the content provider for a tabbed property viewer.
+	 * 
+	 * @param newTabbedPropertyViewer
+	 *            a tabbed property viewer.
+	 */
+	private void init(TabbedPropertyViewer newTabbedPropertyViewer) {
+		this.tabbedPropertyViewer = newTabbedPropertyViewer;
+		currentPart = tabbedPropertyViewer.getWorkbenchPart();
+		if (currentPart.getAdapter(IPropertySheetPage.class) != null) {
+			tabbedPropertySheetPage = (TabbedPropertySheetPage) currentPart
+					.getAdapter(IPropertySheetPage.class);
+		} else {
+			/*
+			 * Is the part is a IContributedContentsView for the contributor,
+			 * for example, outline view.
+			 */
+			IContributedContentsView view = (IContributedContentsView) currentPart
+					.getAdapter(IContributedContentsView.class);
+			if (view != null) {
+				IWorkbenchPart part = view.getContributingPart();
+				if (part != null) {
+					tabbedPropertySheetPage = (TabbedPropertySheetPage) part
+							.getAdapter(IPropertySheetPage.class);
+				}
+			}
+		}
+		Assert
+				.isNotNull(
+						tabbedPropertySheetPage,
+						"DynamicTabListContentProvider could not find the TabbedPropertySheetPage for the active part");//$NON-NLS-1$
+		startListening();
+	}
+
+	/**
+	 * Start listening to tab selection change events.
+	 */
+	private void startListening() {
+		tabbedPropertySheetPage.addTabSelectionListener(this);
+	}
+
+	/**
+	 * Stop listening to tab selection change events.
+	 */
+	private void stopListening() {
+		tabbedPropertySheetPage.removeTabSelectionListener(this);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.views.properties.tabbed.ITabSelectionListener#tabSelected(org.eclipse.ui.views.properties.tabbed.ITabDescriptor)
+	 */
+	public void tabSelected(ITabDescriptor tabDescriptor) {
+		AbstractOverridableTabListPropertySection section = getOverridableTabListPropertySection();
+		Assert.isNotNull(section);
+		int selectedIndex = tabbedPropertyViewer.getSelectionIndex();
+		section.selectTab(selectedIndex);
+	}
+
+	/**
+	 * set the selected tab from the list of tabs provided by the section.
+	 */
+	private void setSelectedTab() {
+		TabDescriptor currentSelectedTabInList = null;
+		IStructuredSelection selectionFromList = (IStructuredSelection) tabbedPropertyViewer
+				.getSelection();
+		if (!selectionFromList.equals(StructuredSelection.EMPTY)) {
+			currentSelectedTabInList = (TabDescriptor) selectionFromList
+					.getFirstElement();
+		}
+		AbstractOverridableTabListPropertySection section = getOverridableTabListPropertySection();
+		if (section == null) {
+			if (currentSelectedTabInList == null) {
+				/*
+				 * make sure there is a selected tab in the list.
+				 */
+				TabDescriptor newSelectedTab = (TabDescriptor) tabbedPropertyViewer
+						.getElementAt(0);
+				if (newSelectedTab != null) {
+					tabbedPropertyViewer.setSelection(new StructuredSelection(
+							newSelectedTab), true);
+				}
+			}
+			return;
+		}
+		ITabItem[] dynamicTabItems = section.getTabs();
+		if (dynamicTabItems == null) {
+			/*
+			 * if the section does not provide overridden tabs, return.
+			 */
+			return;
+		}
+		int selectedTabIndex = -1;
+		for (int i = 0; i < dynamicTabItems.length; i++) {
+			if (dynamicTabItems[i].isSelected()) {
+				selectedTabIndex = i;
+			}
+		}
+		if (currentSelectedTabInList == null ||
+				!currentSelectedTabInList.getText().equals(
+						dynamicTabItems[selectedTabIndex].getText())) {
+			TabDescriptor newSelectedTab = (TabDescriptor) tabbedPropertyViewer
+					.getElementAt(selectedTabIndex);
+			tabbedPropertyViewer.setSelection(new StructuredSelection(
+					newSelectedTab), true);
+		}
+	}
+
+	/**
+	 * Get the list of tabs to display in the tabbed property sheet page.
+	 * 
+	 * @param inputElement
+	 *            The current input element.
+	 * @return the list of tabs.
+	 */
+	private ITabDescriptor[] getOverrideTabs(Object inputElement) {
+		ITabDescriptor tabDescriptors[] = registry.getTabDescriptors(
+				currentPart, (ISelection) inputElement);
+		if (tabDescriptors == TabbedPropertyRegistry.EMPTY_DESCRIPTOR_ARRAY) {
+			/*
+			 * We clone the dynamic tabs from the single tab in the registry. If
+			 * the registry has no tabs for the selection, return.
+			 */
+			return tabDescriptors;
+		}
+		AbstractOverridableTabListPropertySection section = getOverridableTabListPropertySection();
+		Assert.isNotNull(section);
+		ITabItem[] tabItems = section.getTabs();
+		if (tabItems == null) {
+			/*
+			 * if the section does not provide overridden tabs, return the
+			 * default tabs from the registry.
+			 */
+			return tabDescriptors;
+		}
+		ITabDescriptor[] overrideTabDescriptors = new ITabDescriptor[tabItems.length];
+		TabDescriptor target = (TabDescriptor) tabDescriptors[0];
+		for (int i = 0; i < tabItems.length; i++) {
+			TabDescriptor cloneTabDescriptor = (TabDescriptor) target.clone();
+			cloneTabDescriptor.setLabel(tabItems[i].getText());
+			cloneTabDescriptor.setImage(tabItems[i].getImage());
+			cloneTabDescriptor.setIndented(tabItems[i].isIndented());
+			cloneTabDescriptor.setSelected(tabItems[i].isSelected());
+			overrideTabDescriptors[i] = cloneTabDescriptor;
+			// System.out.print("override " + i + " [" +  //$NON-NLS-1$//$NON-NLS-2$
+			// tabItems[i].getText() + "]");//$NON-NLS-1$
+			// if (tabItems[i].isSelected()) {
+			// System.out.print(" selected");//$NON-NLS-1$
+			// }
+			// System.out.println("");//$NON-NLS-1$
+		}
+		return overrideTabDescriptors;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.views.properties.tabbed.IOverridableTabListContentProvider#overrideTabs()
+	 */
+	public void overrideTabs() {
+		stopListening();
+		Object input = tabbedPropertyViewer.getInput();
+		tabbedPropertyViewer.setInput(input);
+		setSelectedTab();
+		startListening();
+	}
+
+	/**
+	 * Get the section implementation that provides the list of tabs. In our
+	 * implementation, all the sections provide the list of tabs, so we select
+	 * the first section from the tab descriptor.
+	 * 
+	 * @return the section.
+	 */
+	private AbstractOverridableTabListPropertySection getOverridableTabListPropertySection() {
+		TabContents tab = tabbedPropertySheetPage.getCurrentTab();
+		Assert.isNotNull(tab);
+		if (tab != null) {
+			ISection section = tab.getSectionAtIndex(0);
+			if (section instanceof AbstractOverridableTabListPropertySection) {
+				return (AbstractOverridableTabListPropertySection) section;
+			}
+		}
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/SectionDescriptor.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/SectionDescriptor.java
new file mode 100644
index 0000000..5489912
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/SectionDescriptor.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.IFilter;
+import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewPlugin;
+import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewStatusCodes;
+import org.eclipse.ui.internal.views.properties.tabbed.l10n.TabbedPropertyMessages;
+import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
+import org.eclipse.ui.views.properties.tabbed.ISection;
+import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
+
+import com.ibm.icu.text.MessageFormat;
+
+/**
+ * Represents the default implementation of a section descriptor on the tabbed
+ * property sections extensions. This implementation assumes that we are
+ * interested in selected objects in an IStructuredSelection.
+ * 
+ * @author Anthony Hunter
+ */
+public class SectionDescriptor extends AbstractSectionDescriptor {
+
+	private static final String ATT_ID = "id"; //$NON-NLS-1$
+
+	private static final String ATT_TARGET_TAB = "tab"; //$NON-NLS-1$
+
+	private static final String ATT_AFTER_SECTION = "afterSection"; //$NON-NLS-1$
+
+	private static final String ATT_CLASS = "class"; //$NON-NLS-1$
+
+	private static final String ATT_SECTION_FILTER = "filter"; //$NON-NLS-1$	
+
+	private static final String ATT_SECTION_ENABLES_FOR = "enablesFor"; //$NON-NLS-1$	
+
+	private static final String ATT_INPUT_TYPE = "type"; //$NON-NLS-1$
+
+	private static final String ELEMENT_INPUT = "input"; //$NON-NLS-1$
+
+	private String id;
+
+	private String targetTab;
+
+	private String afterSection;
+
+	private ArrayList inputTypes;
+
+	private IFilter filter;
+
+	private int enablesFor = ENABLES_FOR_ANY;
+
+	private IConfigurationElement configurationElement;
+
+	/**
+	 * Constructor for the section descriptor.
+	 * 
+	 * @param configurationElement
+	 *            the configuration element for the section descriptor.
+	 * @param typeMapper
+	 *            The type mapper.
+	 */
+	protected SectionDescriptor(IConfigurationElement configurationElement,
+			ITypeMapper typeMapper) {
+		super(typeMapper);
+		this.configurationElement = configurationElement;
+
+		id = getConfigurationElement().getAttribute(ATT_ID);
+		targetTab = getConfigurationElement().getAttribute(ATT_TARGET_TAB);
+		afterSection = getConfigurationElement()
+				.getAttribute(ATT_AFTER_SECTION);
+		if (getConfigurationElement().getAttribute(ATT_SECTION_ENABLES_FOR) != null) {
+			String enablesForStr = getConfigurationElement().getAttribute(
+					ATT_SECTION_ENABLES_FOR);
+			int enablesForTest = Integer.parseInt(enablesForStr);
+			if (enablesForTest > 0) {
+				enablesFor = enablesForTest;
+			}
+		}
+
+		if (id == null || targetTab == null) {
+			// the section id and tab are mandatory - log error
+			handleSectionError(null);
+		}
+	}
+
+	/**
+	 * Handle the section error when an issue is found loading from the
+	 * configuration element.
+	 * 
+	 * @param exception
+	 *            an optional CoreException
+	 */
+	private void handleSectionError(CoreException exception) {
+		String pluginId = getConfigurationElement().getDeclaringExtension()
+				.getNamespaceIdentifier();
+		String message = TabbedPropertyMessages.SectionDescriptor_Section_error;
+		if (exception == null) {
+			message = MessageFormat.format(
+					TabbedPropertyMessages.SectionDescriptor_Section_error,
+					new Object[] { pluginId });
+		} else {
+			message = MessageFormat
+					.format(
+							TabbedPropertyMessages.SectionDescriptor_class_not_found_error,
+							new Object[] { pluginId });
+		}
+		IStatus status = new Status(IStatus.ERROR, pluginId,
+				TabbedPropertyViewStatusCodes.SECTION_ERROR, message, exception);
+		TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getId()
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getFilter()
+	 */
+	public IFilter getFilter() {
+		if (filter == null) {
+			try {
+				if (getConfigurationElement().getAttribute(ATT_SECTION_FILTER) != null) {
+					filter = (IFilter) configurationElement
+							.createExecutableExtension(ATT_SECTION_FILTER);
+				}
+			} catch (CoreException exception) {
+				handleSectionError(exception);
+			}
+		}
+		return filter;
+	}
+
+	/**
+	 * Retrieves the value for section enablement which is a precise number of
+	 * items selected. For example: enablesFor=" 4" enables the action only when
+	 * 4 items are selected. If not specified, enable for all selections.
+	 * 
+	 * @return the value for section enablement.
+	 */
+	public int getEnablesFor() {
+		return enablesFor;
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getTargetTab()
+	 */
+	public String getTargetTab() {
+		return targetTab;
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getAfterSection()
+	 */
+	public String getAfterSection() {
+		if (afterSection == null) {
+			return super.getAfterSection();
+		}
+		return afterSection;
+	}
+
+	/**
+	 * Creates an instance of a section described by this descriptor
+	 * 
+	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getSectionClass()
+	 */
+	public ISection getSectionClass() {
+		ISection section = null;
+		try {
+			section = (ISection) getConfigurationElement()
+					.createExecutableExtension(ATT_CLASS);
+		} catch (CoreException exception) {
+			handleSectionError(exception);
+		}
+
+		return section;
+	}
+
+	/**
+	 * Gets the input types that are valid for this section.
+	 * 
+	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getInputTypes()
+	 */
+	public List getInputTypes() {
+		if (inputTypes == null) {
+			inputTypes = new ArrayList();
+			IConfigurationElement[] elements = getConfigurationElement()
+					.getChildren(ELEMENT_INPUT);
+			for (int i = 0; i < elements.length; i++) {
+				IConfigurationElement element = elements[i];
+				inputTypes.add(element.getAttribute(ATT_INPUT_TYPE));
+			}
+		}
+
+		return inputTypes;
+	}
+
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return getId();
+	}
+
+	/**
+	 * @return Returns the configurationElement.
+	 */
+	private IConfigurationElement getConfigurationElement() {
+		return configurationElement;
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabDescriptor.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabDescriptor.java
new file mode 100644
index 0000000..d2bfee6
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabDescriptor.java
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import com.ibm.icu.text.MessageFormat;
+
+import org.eclipse.swt.graphics.Image;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+
+import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewPlugin;
+import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewStatusCodes;
+import org.eclipse.ui.internal.views.properties.tabbed.l10n.TabbedPropertyMessages;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
+import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
+
+/**
+ * Represents the default implementation of a tab descriptor on the tabbed
+ * property tabs extensions.
+ * 
+ * @author Anthony Hunter
+ */
+public class TabDescriptor extends AbstractTabDescriptor {
+
+	private static final String ATT_ID = "id"; //$NON-NLS-1$
+
+	private static final String ATT_LABEL = "label"; //$NON-NLS-1$
+
+	private static final String ATT_IMAGE = "image"; //$NON-NLS-1$
+
+	private static final String ATT_INDENTED = "indented"; //$NON-NLS-1$
+
+	private static final String ATT_CATEGORY = "category"; //$NON-NLS-1$
+
+	private static final String ATT_AFTER_TAB = "afterTab"; //$NON-NLS-1$
+
+	private final static String TAB_ERROR = TabbedPropertyMessages.TabDescriptor_Tab_error;
+
+	private String id;
+
+	private String label;
+
+	private Image image;
+
+	private boolean selected;
+
+	private boolean indented;
+
+	private String category;
+
+	private String afterTab;
+
+	/**
+	 * Constructor for TabDescriptor.
+	 * 
+	 * @param configurationElement
+	 *            the configuration element for the tab descriptor.
+	 */
+	public TabDescriptor(IConfigurationElement configurationElement) {
+		super();
+		if (configurationElement != null) {
+			id = configurationElement.getAttribute(ATT_ID);
+			label = configurationElement.getAttribute(ATT_LABEL);
+			String imageString = configurationElement.getAttribute(ATT_IMAGE);
+			if (imageString != null) {
+				image = AbstractUIPlugin.imageDescriptorFromPlugin(
+						configurationElement.getDeclaringExtension()
+								.getNamespaceIdentifier(), imageString)
+						.createImage();
+			}
+			String indentedString = configurationElement
+					.getAttribute(ATT_INDENTED);
+			indented = indentedString != null && indentedString.equals("true"); //$NON-NLS-1$
+			category = configurationElement.getAttribute(ATT_CATEGORY);
+			afterTab = configurationElement.getAttribute(ATT_AFTER_TAB);
+			if (id == null || label == null || category == null) {
+				// the tab id, label and category are mandatory - log error
+				handleTabError(configurationElement, null);
+			}
+		}
+		selected = false;
+	}
+
+	/**
+	 * Get the unique identifier for the tab.
+	 * 
+	 * @return the unique identifier for the tab.
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/**
+	 * Get the text label for the tab.
+	 * 
+	 * @return the text label for the tab.
+	 */
+	public String getLabel() {
+		return label;
+	}
+
+	/**
+	 * Get the identifier of the tab after which this tab should be displayed.
+	 * When two or more tabs belong to the same category, they are sorted by the
+	 * after tab values.
+	 * 
+	 * @return the identifier of the tab.
+	 */
+	public String getAfterTab() {
+		if (afterTab == null) {
+			return super.getAfterTab();
+		}
+		return afterTab;
+	}
+
+	/**
+	 * Get the category this tab belongs to.
+	 * 
+	 * @return Get the category this tab belongs to.
+	 */
+	public String getCategory() {
+		return category;
+	}
+
+	/**
+	 * Returns whether the given section was added to this tab. The section can
+	 * be appended if its tab attribute matches the tab id. The afterSection
+	 * attribute indicates the order in which the section should be appended.
+	 * 
+	 * @param target
+	 *            the section descriptor to append.
+	 */
+	protected boolean append(ISectionDescriptor target) {
+		if (!target.getTargetTab().equals(id)) {
+			return false;
+		}
+
+		if (insertSectionDescriptor(target)) {
+			return true;
+		}
+
+		getSectionDescriptors().add(target);
+		return true;
+	}
+
+	/**
+	 * Insert the section descriptor into the section descriptor list.
+	 * 
+	 * @param target
+	 *            the section descriptor to insert.
+	 * @return <code>true</code> if the target descriptor was added to the
+	 *         descriptors list.
+	 */
+	private boolean insertSectionDescriptor(ISectionDescriptor target) {
+		if (target.getAfterSection().equals(TOP)) {
+			getSectionDescriptors().add(0, target);
+			return true;
+		}
+		for (int i = 0; i < getSectionDescriptors().size(); i++) {
+			ISectionDescriptor descriptor = (ISectionDescriptor) getSectionDescriptors()
+					.get(i);
+			if (target.getAfterSection().equals(descriptor.getId())) {
+				getSectionDescriptors().add(i + 1, target);
+				return true;
+			} else if (descriptor.getAfterSection().equals(target.getId())) {
+				getSectionDescriptors().add(i, target);
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return getId();
+	}
+
+	/**
+	 * Handle the tab error when an issue is found loading from the
+	 * configuration element.
+	 * 
+	 * @param configurationElement
+	 *            the configuration element
+	 * @param exception
+	 *            an optional CoreException
+	 */
+	private void handleTabError(IConfigurationElement configurationElement,
+			CoreException exception) {
+		String pluginId = configurationElement.getDeclaringExtension()
+				.getNamespaceIdentifier();
+		String message = MessageFormat.format(TAB_ERROR,
+				new Object[] { pluginId });
+		IStatus status = new Status(IStatus.ERROR, pluginId,
+				TabbedPropertyViewStatusCodes.TAB_ERROR, message, exception);
+		TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
+	}
+
+	/**
+	 * Set the image for the tab.
+	 * 
+	 * @param image
+	 *            the image for the tab.
+	 */
+	protected void setImage(Image image) {
+		this.image = image;
+	}
+
+	/**
+	 * Set the indicator to determine if the tab should be displayed as
+	 * indented.
+	 * 
+	 * @param indented
+	 *            <code>true</code> if the tab should be displayed as
+	 *            indented.
+	 */
+	protected void setIndented(boolean indented) {
+		this.indented = indented;
+	}
+
+	/**
+	 * Set the indicator to determine if the tab should be the selected tab in
+	 * the list.
+	 * 
+	 * @param selected
+	 *            <code>true</code> if the tab should be the selected tab in
+	 *            the list.
+	 */
+	protected void setSelected(boolean selected) {
+		this.selected = selected;
+	}
+
+	/**
+	 * Set the text label for the tab.
+	 * 
+	 * @param label
+	 *            the text label for the tab.
+	 */
+	protected void setLabel(String label) {
+		this.label = label;
+	}
+
+	/**
+	 * Get the image for the tab.
+	 * 
+	 * @return the image for the tab.
+	 */
+	public Image getImage() {
+		return image;
+	}
+
+	/**
+	 * Determine if the tab is selected.
+	 * 
+	 * @return <code>true</code> if the tab is selected.
+	 */
+	public boolean isSelected() {
+		return selected;
+	}
+
+	/**
+	 * Determine if the tab should be displayed as indented.
+	 * 
+	 * @return <code>true</code> if the tab should be displayed as indented.
+	 */
+	public boolean isIndented() {
+		return indented;
+	}
+
+	/**
+	 * Get the text label for the tab.
+	 * 
+	 * @return the text label for the tab.
+	 */
+	public String getText() {
+		return label;
+	}
+
+	/**
+	 * Disposes this descriptor.
+	 * 
+	 * @since 3.7
+	 */
+	public void dispose() {
+		if (image != null) {
+			image.dispose();
+			image = null;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabListContentProvider.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabListContentProvider.java
new file mode 100644
index 0000000..14c1771
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabListContentProvider.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * The default implementation of the content provider for the 
+ * tabbed property sheet page's list of tabs.
+ * 
+ * @author Anthony Hunter
+ */
+public class TabListContentProvider
+	implements IStructuredContentProvider {
+	
+	protected TabbedPropertyRegistry registry;
+
+	protected IWorkbenchPart currentPart;
+	
+	/**
+	 * Constructor for TabListContentProvider.
+	 * @param registry the tabbed property registry.
+	 */
+	public TabListContentProvider(TabbedPropertyRegistry registry) {
+		this.registry = registry;
+	}
+	
+	/**
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object inputElement) {
+		Assert.isTrue(inputElement instanceof ISelection);
+			return registry
+			.getTabDescriptors(currentPart, (ISelection) inputElement);
+	}
+
+	/**
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+		/* not used */
+	}
+
+	/**
+	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		this.currentPart = ((TabbedPropertyViewer)viewer).getWorkbenchPart();
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyComposite.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyComposite.java
new file mode 100644
index 0000000..1fb31e7
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyComposite.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+
+
+/**
+ * Composite responsible for drawing the tabbed property sheet page.
+ * 
+ * @author Anthony Hunter
+ */
+public class TabbedPropertyComposite
+	extends Composite {
+
+	private TabbedPropertySheetWidgetFactory factory;
+
+	private Composite mainComposite;
+
+	private Composite leftComposite;
+
+	private ScrolledComposite scrolledComposite;
+
+	private Composite tabComposite;
+
+	private TabbedPropertyTitle title;
+
+	private TabbedPropertyList listComposite;
+
+	private boolean displayTitle;
+
+	/**
+	 * Constructor for a TabbedPropertyComposite
+	 * 
+	 * @param parent
+	 *            the parent widget.
+	 * @param factory
+	 *            the widget factory.
+	 * @param displayTitle
+	 *            if <code>true</code>, then the title bar will be displayed.
+	 */
+	public TabbedPropertyComposite(Composite parent,
+			TabbedPropertySheetWidgetFactory factory, boolean displayTitle) {
+		super(parent, SWT.NO_FOCUS);
+		this.factory = factory;
+		this.displayTitle = displayTitle;
+
+		createMainComposite();
+	}
+
+	/**
+	 * Create the main composite.
+	 */
+	protected void createMainComposite() {
+		mainComposite = factory.createComposite(this, SWT.NO_FOCUS);
+		mainComposite.setLayout(new FormLayout());
+		FormData formData = new FormData();
+		formData.left = new FormAttachment(0, 0);
+		formData.right = new FormAttachment(100, 0);
+		formData.top = new FormAttachment(0, 0);
+		formData.bottom = new FormAttachment(100, 0);
+		mainComposite.setLayoutData(formData);
+
+		createMainContents();
+	}
+
+	/**
+	 * Create the contents in the main composite.
+	 */
+	protected void createMainContents() {
+        if (displayTitle) {
+            title = new TabbedPropertyTitle(mainComposite, factory);
+
+            FormData data = new FormData();
+            data.left = new FormAttachment(0, 0);
+            data.right = new FormAttachment(100, 0);
+            data.top = new FormAttachment(0, 0);
+            title.setLayoutData(data);
+        }
+
+		leftComposite = factory.createComposite(mainComposite, SWT.NO_FOCUS);
+		leftComposite.setLayout(new FormLayout());
+
+		scrolledComposite = factory.createScrolledComposite(mainComposite, SWT.H_SCROLL
+			| SWT.V_SCROLL | SWT.NO_FOCUS);
+
+		FormData formData = new FormData();
+		formData.left = new FormAttachment(leftComposite, 0);
+		formData.right = new FormAttachment(100, 0);
+        if (displayTitle) {
+            formData.top = new FormAttachment(title, 0);
+        } else {
+            formData.top = new FormAttachment(0, 0);
+        }
+		formData.bottom = new FormAttachment(100, 0);
+		scrolledComposite.setLayoutData(formData);
+
+		formData = new FormData();
+		formData.left = new FormAttachment(0, 0);
+		formData.right = new FormAttachment(scrolledComposite, 0);
+        if (displayTitle) {
+            formData.top = new FormAttachment(title, 0);
+        } else {
+            formData.top = new FormAttachment(0, 0);
+        }
+		formData.bottom = new FormAttachment(100, 0);
+		leftComposite.setLayoutData(formData);
+
+        tabComposite = factory.createComposite(scrolledComposite, SWT.NO_FOCUS);
+        tabComposite.setLayout(new FormLayout());
+
+		scrolledComposite.setContent(tabComposite);
+		scrolledComposite.setAlwaysShowScrollBars(false);
+		scrolledComposite.setExpandVertical(true);
+		scrolledComposite.setExpandHorizontal(true);
+
+		listComposite = new TabbedPropertyList(leftComposite, factory);
+		formData = new FormData();
+		formData.left = new FormAttachment(0, 0);
+		formData.right = new FormAttachment(100, 0);
+		formData.top = new FormAttachment(0, 0);
+		formData.bottom = new FormAttachment(100, 0);
+		listComposite.setLayoutData(formData);
+	}
+
+	/**
+	 * Get the tabbed property list, which is the list of tabs on the left hand
+	 * side of this composite.
+	 * 
+	 * @return the tabbed property list.
+	 */
+	public TabbedPropertyList getList() {
+		return listComposite;
+	}
+
+	/**
+	 * Get the tabbed property title bar.
+	 * 
+	 * @return the tabbed property title bar or <code>null</code> if not used.
+	 */
+	public TabbedPropertyTitle getTitle() {
+		return title;
+	}
+
+	/**
+	 * Get the tab composite where sections display their property contents.
+	 * 
+	 * @return the tab composite.
+	 */
+	public Composite getTabComposite() {
+		return tabComposite;
+	}
+
+	/**
+	 * Get the scrolled composite which surrounds the title bar and tab
+	 * composite.
+	 * 
+	 * @return the scrolled composite.
+	 */
+	public ScrolledComposite getScrolledComposite() {
+		return scrolledComposite;
+	}
+
+	/**
+	 * Get the widget factory.
+	 * 
+	 * @return the widget factory.
+	 */
+	protected TabbedPropertySheetWidgetFactory getFactory() {
+		return factory;
+	}
+
+	/**
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose() {
+		listComposite.dispose();
+		if (displayTitle) {
+			title.dispose();
+		}
+		super.dispose();
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyList.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyList.java
new file mode 100644
index 0000000..d8b0758
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyList.java
@@ -0,0 +1,1040 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Mariot Chauvin <mariot.chauvin@obeo.fr> - bug 259553
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.internal.views.properties.tabbed.l10n.TabbedPropertyMessages;
+import org.eclipse.ui.views.properties.tabbed.ITabItem;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+
+
+/**
+ * Shows the list of tabs in the tabbed property sheet page.
+ *
+ * @author Anthony Hunter
+ */
+public class TabbedPropertyList
+	extends Composite {
+
+	private static final ListElement[] ELEMENTS_EMPTY = new ListElement[0];
+
+	protected static final int NONE = -1;
+
+	protected static final int INDENT = 7;
+
+	private boolean focus = false;
+
+	private ListElement[] elements;
+
+	private int selectedElementIndex = NONE;
+
+	private int topVisibleIndex = NONE;
+
+	private int bottomVisibleIndex = NONE;
+
+	private TopNavigationElement topNavigationElement;
+
+	private BottomNavigationElement bottomNavigationElement;
+
+	private int widestLabelIndex = NONE;
+
+	private int tabsThatFitInComposite = NONE;
+
+	private Color widgetForeground;
+
+	private Color widgetBackground;
+
+	private Color widgetNormalShadow;
+
+	private Color widgetDarkShadow;
+
+	private Color listBackground;
+
+	private Color hoverGradientStart;
+
+	private Color hoverGradientEnd;
+
+	private Color defaultGradientStart;
+
+	private Color defaultGradientEnd;
+
+	private Color indentedDefaultBackground;
+
+	private Color indentedHoverBackground;
+
+	private Color navigationElementShadowStroke;
+
+	private Color bottomNavigationElementShadowStroke1;
+
+	private Color bottomNavigationElementShadowStroke2;
+
+	private TabbedPropertySheetWidgetFactory factory;
+
+	/**
+	 * One of the tabs in the tabbed property list.
+	 */
+	public class ListElement extends Canvas {
+
+		private ITabItem tab;
+
+		private int index;
+
+		private boolean selected;
+
+		private boolean hover;
+
+		/**
+		 * Constructor for ListElement.
+		 *
+		 * @param parent
+		 *            the parent Composite.
+		 * @param tab
+		 *            the tab item for the element.
+		 * @param index
+		 *            the index in the list.
+		 */
+		public ListElement(Composite parent, final ITabItem tab, int index) {
+			super(parent, SWT.NO_FOCUS);
+			this.tab = tab;
+			hover = false;
+			selected = false;
+			this.index = index;
+
+			addPaintListener(new PaintListener() {
+
+				public void paintControl(PaintEvent e) {
+					paint(e);
+				}
+			});
+			addMouseListener(new MouseAdapter() {
+
+				public void mouseUp(MouseEvent e) {
+					if (!selected) {
+						select(getIndex(ListElement.this));
+						/*
+						 * We set focus to the tabbed property composite so that
+						 * focus is moved to the appropriate widget in the
+						 * section.
+						 */
+						Composite tabbedPropertyComposite = getParent();
+						while (!(tabbedPropertyComposite instanceof TabbedPropertyComposite)) {
+							tabbedPropertyComposite = tabbedPropertyComposite
+								.getParent();
+						}
+						tabbedPropertyComposite.setFocus();
+					}
+				}
+			});
+			// RAP does not support this yet
+//			addMouseMoveListener(new MouseMoveListener() {
+//
+//				public void mouseMove(MouseEvent e) {
+//					if (!hover) {
+//						hover = true;
+//						redraw();
+//					}
+//				}
+//			});
+//			addMouseTrackListener(new MouseTrackAdapter() {
+//
+//				public void mouseExit(MouseEvent e) {
+//					hover = false;
+//					redraw();
+//				}
+//			});
+			// /RAP
+		}
+
+		/**
+		 * Set selected value for this element.
+		 *
+		 * @param selected
+		 *            the selected value.
+		 */
+		public void setSelected(boolean selected) {
+			this.selected = selected;
+			redraw();
+		}
+
+		/**
+		 * Paint the element.
+		 *
+		 * @param e
+		 *            the paint event.
+		 */
+		private void paint(PaintEvent e) {
+			/*
+			 * draw the top two lines of the tab, same for selected, hover and
+			 * default
+			 */
+			Rectangle bounds = getBounds();
+			e.gc.setForeground(widgetNormalShadow);
+			e.gc.drawLine(0, 0, bounds.width - 1, 0);
+			e.gc.setForeground(listBackground);
+			e.gc.drawLine(0, 1, bounds.width - 1, 1);
+
+			/* draw the fill in the tab */
+			if (selected) {
+				e.gc.setBackground(listBackground);
+				e.gc.fillRectangle(0, 2, bounds.width, bounds.height - 1);
+			} else if (hover && tab.isIndented()) {
+				e.gc.setBackground(indentedHoverBackground);
+				e.gc.fillRectangle(0, 2, bounds.width - 1, bounds.height - 1);
+			} else if (hover) {
+				e.gc.setForeground(hoverGradientStart);
+				e.gc.setBackground(hoverGradientEnd);
+				e.gc.fillGradientRectangle(0, 2, bounds.width - 1,
+						bounds.height - 1, true);
+			} else if (tab.isIndented()) {
+				e.gc.setBackground(indentedDefaultBackground);
+				e.gc.fillRectangle(0, 2, bounds.width - 1, bounds.height - 1);
+			} else {
+				e.gc.setForeground(defaultGradientStart);
+				e.gc.setBackground(defaultGradientEnd);
+				e.gc.fillGradientRectangle(0, 2, bounds.width - 1,
+						bounds.height - 1, true);
+			}
+
+			if (!selected) {
+				e.gc.setForeground(widgetNormalShadow);
+				e.gc.drawLine(bounds.width - 1, 1, bounds.width - 1,
+						bounds.height + 1);
+			}
+
+			int textIndent = INDENT;
+			FontMetrics fm = e.gc.getFontMetrics();
+			int height = fm.getHeight();
+			int textMiddle = (bounds.height - height) / 2;
+
+			if (selected && tab.getImage() != null
+				&& !tab.getImage().isDisposed()) {
+				/* draw the icon for the selected tab */
+				if (tab.isIndented()) {
+					textIndent = textIndent + INDENT;
+				} else {
+					textIndent = textIndent - 3;
+				}
+				e.gc.drawImage(tab.getImage(), textIndent, textMiddle - 1);
+				textIndent = textIndent + 16 + 5;
+			} else if (tab.isIndented()) {
+				textIndent = textIndent + INDENT;
+			}
+
+			/* draw the text */
+			e.gc.setForeground(widgetForeground);
+			if (selected) {
+				/* selected tab is bold font */
+				e.gc.setFont(JFaceResources.getFontRegistry().getBold(
+						JFaceResources.DEFAULT_FONT));
+			}
+			e.gc.drawText(tab.getText(), textIndent, textMiddle, true);
+			if (((TabbedPropertyList) getParent()).focus && selected) {
+				/* draw a line if the tab has focus */
+				Point point = e.gc.textExtent(tab.getText());
+				e.gc.drawLine(textIndent, bounds.height - 4, textIndent
+					+ point.x, bounds.height - 4);
+			}
+
+			/* draw the bottom line on the tab for selected and default */
+			if (!hover) {
+				e.gc.setForeground(listBackground);
+				e.gc.drawLine(0, bounds.height - 1, bounds.width - 2,
+						bounds.height - 1);
+			}
+		}
+
+		/**
+		 * Get the tab item.
+		 *
+		 * @return the tab item.
+		 */
+		public ITabItem getTabItem() {
+			return tab;
+		}
+
+		public String toString() {
+			return tab.getText();
+		}
+	}
+
+	/**
+	 * The top navigation element in the tabbed property list. It looks like a
+	 * scroll button when scrolling is needed or is just a spacer when no
+	 * scrolling is required.
+	 */
+	public class TopNavigationElement extends Canvas {
+
+		/**
+		 * Constructor for TopNavigationElement.
+		 *
+		 * @param parent
+		 *            the parent Composite.
+		 */
+		public TopNavigationElement(Composite parent) {
+			super(parent, SWT.NO_FOCUS);
+			addPaintListener(new PaintListener() {
+
+				public void paintControl(PaintEvent e) {
+					paint(e);
+				}
+			});
+			addMouseListener(new MouseAdapter() {
+
+				public void mouseUp(MouseEvent e) {
+					if (isUpScrollRequired()) {
+						bottomVisibleIndex--;
+						if (topVisibleIndex != 0) {
+							topVisibleIndex--;
+						}
+						layoutTabs();
+						topNavigationElement.redraw();
+						bottomNavigationElement.redraw();
+					}
+				}
+			});
+		}
+
+		/**
+		 * Paint the element.
+		 *
+		 * @param e
+		 *            the paint event.
+		 */
+		private void paint(PaintEvent e) {
+			e.gc.setBackground(widgetBackground);
+			e.gc.setForeground(widgetForeground);
+			Rectangle bounds = getBounds();
+
+			if (elements.length != 0) {
+				e.gc.fillRectangle(0, 0, bounds.width, bounds.height);
+				e.gc.setForeground(widgetNormalShadow);
+				e.gc.drawLine(bounds.width - 1, 0, bounds.width - 1,
+					bounds.height - 1);
+			} else {
+				e.gc.setBackground(listBackground);
+				e.gc.fillRectangle(0, 0, bounds.width, bounds.height);
+				int textIndent = INDENT;
+				FontMetrics fm = e.gc.getFontMetrics();
+				int height = fm.getHeight();
+				int textMiddle = (bounds.height - height) / 2;
+				e.gc.setForeground(widgetForeground);
+				String properties_not_available = TabbedPropertyMessages.TabbedPropertyList_properties_not_available;
+				e.gc.drawText(properties_not_available, textIndent, textMiddle);
+			}
+
+			if (isUpScrollRequired()) {
+				e.gc.setForeground(widgetDarkShadow);
+				int middle = bounds.width / 2;
+				e.gc.drawLine(middle + 1, 3, middle + 5, 7);
+				e.gc.drawLine(middle, 3, middle - 4, 7);
+				e.gc.drawLine(middle - 3, 7, middle + 4, 7);
+
+				e.gc.setForeground(listBackground);
+				e.gc.drawLine(middle, 4, middle + 1, 4);
+				e.gc.drawLine(middle - 1, 5, middle + 2, 5);
+				e.gc.drawLine(middle - 2, 6, middle + 3, 6);
+
+				e.gc.setForeground(widgetNormalShadow);
+				e.gc.drawLine(0, 0, bounds.width - 2, 0);
+				e.gc.setForeground(navigationElementShadowStroke);
+				e.gc.drawLine(0, 1, bounds.width - 2, 1);
+				e.gc.drawLine(0, bounds.height - 1, bounds.width - 2,
+						bounds.height - 1);
+			}
+		}
+	}
+
+	/**
+	 * The top navigation element in the tabbed property list. It looks like a
+	 * scroll button when scrolling is needed or is just a spacer when no
+	 * scrolling is required.
+	 */
+	public class BottomNavigationElement extends Canvas {
+
+		/**
+		 * Constructor for BottomNavigationElement.
+		 *
+		 * @param parent
+		 *            the parent Composite.
+		 */
+		public BottomNavigationElement(Composite parent) {
+			super(parent, SWT.NO_FOCUS);
+			addPaintListener(new PaintListener() {
+
+				public void paintControl(PaintEvent e) {
+					paint(e);
+				}
+			});
+			addMouseListener(new MouseAdapter() {
+
+				public void mouseUp(MouseEvent e) {
+					if (isDownScrollRequired()) {
+						topVisibleIndex++;
+						if (bottomVisibleIndex != elements.length - 1) {
+							bottomVisibleIndex++;
+						}
+						layoutTabs();
+						topNavigationElement.redraw();
+						bottomNavigationElement.redraw();
+					}
+				}
+			});
+		}
+
+		/**
+		 * Paint the element.
+		 *
+		 * @param e
+		 *            the paint event.
+		 */
+		private void paint(PaintEvent e) {
+			e.gc.setBackground(widgetBackground);
+			e.gc.setForeground(widgetForeground);
+			Rectangle bounds = getBounds();
+
+			if (elements.length != 0) {
+				e.gc.fillRectangle(0, 0, bounds.width, bounds.height);
+				e.gc.setForeground(widgetNormalShadow);
+				e.gc.drawLine(bounds.width - 1, 0, bounds.width - 1,
+						bounds.height - 1);
+				e.gc.drawLine(0, 0, bounds.width - 1, 0);
+
+				e.gc.setForeground(bottomNavigationElementShadowStroke1);
+				e.gc.drawLine(0, 1, bounds.width - 2, 1);
+				e.gc.setForeground(bottomNavigationElementShadowStroke2);
+				e.gc.drawLine(0, 2, bounds.width - 2, 2);
+			} else {
+				e.gc.setBackground(listBackground);
+				e.gc.fillRectangle(0, 0, bounds.width, bounds.height);
+			}
+
+			if (isDownScrollRequired()) {
+				e.gc.setForeground(widgetDarkShadow);
+				int middle = bounds.width / 2;
+				int bottom = bounds.height - 3;
+				e.gc.drawLine(middle + 1, bottom, middle + 5, bottom - 4);
+				e.gc.drawLine(middle, bottom, middle - 4, bottom - 4);
+				e.gc.drawLine(middle - 3, bottom - 4, middle + 4, bottom - 4);
+
+				e.gc.setForeground(listBackground);
+				e.gc.drawLine(middle, bottom - 1, middle + 1, bottom - 1);
+				e.gc.drawLine(middle - 1, bottom - 2, middle + 2, bottom - 2);
+				e.gc.drawLine(middle - 2, bottom - 3, middle + 3, bottom - 3);
+
+				e.gc.setForeground(widgetNormalShadow);
+				e.gc.drawLine(0, bottom - 7, bounds.width - 2, bottom - 7);
+				e.gc.setForeground(navigationElementShadowStroke);
+				e.gc.drawLine(0, bottom + 2, bounds.width - 2, bottom + 2);
+				e.gc.drawLine(0, bottom - 6, bounds.width - 2, bottom - 6);
+			}
+		}
+	}
+
+	/**
+	 * Constructor for TabbedPropertyList.
+	 *
+	 * @param parent
+	 *            the parent widget.
+	 * @param factory
+	 *            the widget factory.
+	 */
+	public TabbedPropertyList(Composite parent,
+			TabbedPropertySheetWidgetFactory factory) {
+		super(parent, SWT.NO_FOCUS);
+		this.factory = factory;
+		removeAll();
+		setLayout(new FormLayout());
+		initColours();
+		initAccessible();
+		topNavigationElement = new TopNavigationElement(this);
+		bottomNavigationElement = new BottomNavigationElement(this);
+
+		this.addFocusListener(new FocusListener() {
+
+			public void focusGained(FocusEvent e) {
+				focus = true;
+				int i = getSelectionIndex();
+				if (i >= 0) {
+					elements[i].redraw();
+				}
+			}
+
+			public void focusLost(FocusEvent e) {
+				focus = false;
+				int i = getSelectionIndex();
+				if (i >= 0) {
+					elements[i].redraw();
+				}
+			}
+		});
+		this.addControlListener(new ControlAdapter() {
+
+			public void controlResized(ControlEvent e) {
+				computeTopAndBottomTab();
+			}
+		});
+		// RAP not supported yet
+//		this.addTraverseListener(new TraverseListener() {
+//
+//			public void keyTraversed(TraverseEvent e) {
+//				if (e.detail == SWT.TRAVERSE_ARROW_PREVIOUS
+//					|| e.detail == SWT.TRAVERSE_ARROW_NEXT) {
+//					int nMax = elements.length - 1;
+//					int nCurrent = getSelectionIndex();
+//					if (e.detail == SWT.TRAVERSE_ARROW_PREVIOUS) {
+//						nCurrent -= 1;
+//						nCurrent = Math.max(0, nCurrent);
+//					} else if (e.detail == SWT.TRAVERSE_ARROW_NEXT) {
+//						nCurrent += 1;
+//						nCurrent = Math.min(nCurrent, nMax);
+//					}
+//					select(nCurrent);
+//					redraw();
+//				} else {
+//					e.doit = true;
+//				}
+//			}
+//		});
+		// /RAP
+	}
+
+	/**
+	 * Calculate the number of tabs that will fit in the tab list composite.
+	 */
+	protected void computeTabsThatFitInComposite() {
+		tabsThatFitInComposite = Math
+			.round((getSize().y - 22) / getTabHeight());
+		if (tabsThatFitInComposite <= 0) {
+			tabsThatFitInComposite = 1;
+		}
+	}
+
+	/**
+	 * Returns the element with the given index from this list viewer. Returns
+	 * <code>null</code> if the index is out of range.
+	 *
+	 * @param index
+	 *            the zero-based index
+	 * @return the element at the given index, or <code>null</code> if the
+	 *         index is out of range
+	 */
+	public Object getElementAt(int index) {
+		if (index >= 0 && index < elements.length) {
+			return elements[index];
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the zero-relative index of the item which is currently selected
+	 * in the receiver, or -1 if no item is selected.
+	 *
+	 * @return the index of the selected item
+	 */
+	public int getSelectionIndex() {
+		return selectedElementIndex;
+	}
+
+	/**
+	 * Removes all elements from this list.
+	 */
+	public void removeAll() {
+		if (elements != null) {
+			for (int i = 0; i < elements.length; i++) {
+				elements[i].dispose();
+			}
+		}
+		elements = ELEMENTS_EMPTY;
+		selectedElementIndex = NONE;
+		widestLabelIndex = NONE;
+		topVisibleIndex = NONE;
+		bottomVisibleIndex = NONE;
+	}
+
+	/**
+	 * Sets the new list elements.
+	 *
+	 * @param children
+	 */
+	public void setElements(Object[] children) {
+		if (elements != ELEMENTS_EMPTY) {
+			removeAll();
+		}
+		elements = new ListElement[children.length];
+		if (children.length == 0) {
+			widestLabelIndex = NONE;
+		} else {
+			widestLabelIndex = 0;
+			for (int i = 0; i < children.length; i++) {
+				elements[i] = new ListElement(this, (ITabItem) children[i], i);
+				elements[i].setVisible(false);
+				elements[i].setLayoutData(null);
+
+				if (i != widestLabelIndex) {
+					String label = ((ITabItem) children[i]).getText();
+					int width = getTextDimension(label).x;
+					if (((ITabItem) children[i]).isIndented()) {
+						width = width + INDENT;
+					}
+					if (width > getTextDimension(((ITabItem) children[widestLabelIndex])
+							.getText()).x) {
+						widestLabelIndex = i;
+					}
+				}
+			}
+		}
+
+		computeTopAndBottomTab();
+	}
+
+	/**
+	 * Selects one of the elements in the list.
+	 *
+	 * @param index
+	 *            the index of the element to select.
+	 */
+	protected void select(int index) {
+		if (getSelectionIndex() == index) {
+			/*
+			 * this index is already selected.
+			 */
+			return;
+		}
+		if (index >= 0 && index < elements.length) {
+			int lastSelected = getSelectionIndex();
+			elements[index].setSelected(true);
+			selectedElementIndex = index;
+			if (lastSelected != NONE) {
+				elements[lastSelected].setSelected(false);
+				if (getSelectionIndex() != elements.length - 1) {
+					/*
+					 * redraw the next tab to fix the border by calling
+					 * setSelected()
+					 */
+					elements[getSelectionIndex() + 1].setSelected(false);
+				}
+			}
+			topNavigationElement.redraw();
+			bottomNavigationElement.redraw();
+
+			if (selectedElementIndex < topVisibleIndex
+				|| selectedElementIndex > bottomVisibleIndex) {
+				computeTopAndBottomTab();
+			}
+		}
+		notifyListeners(SWT.Selection, new Event());
+	}
+
+	/**
+	 * Deselects all the elements in the list.
+	 */
+	public void deselectAll() {
+		if (getSelectionIndex() != NONE) {
+			elements[getSelectionIndex()].setSelected(false);
+			selectedElementIndex = NONE;
+		}
+	}
+
+	private int getIndex(ListElement element) {
+		return element.index;
+	}
+
+	public Point computeSize(int wHint, int hHint, boolean changed) {
+		Point result = super.computeSize(hHint, wHint, changed);
+		if (widestLabelIndex == -1) {
+			String properties_not_available = TabbedPropertyMessages.TabbedPropertyList_properties_not_available;
+			result.x = getTextDimension(properties_not_available).x + INDENT;
+		} else {
+			ITabItem widestTab = elements[widestLabelIndex].getTabItem();
+			int width = getTextDimension(widestTab.getText()).x + INDENT;
+			/*
+			 * To anticipate for the icon placement we should always keep the
+			 * space available after the label. So when the active tab includes
+			 * an icon the width of the tab doesn't change.
+			 */
+			if (widestTab.getImage() != null) {
+				width = width + 16 + 4;
+			}
+			if (widestTab.isIndented()) {
+				width = width + 10;
+			}
+			/*
+			 * Add 10 pixels to the right of the longest string as a margin.
+			 */
+			result.x = width + 10;
+		}
+		return result;
+	}
+
+	/**
+	 * Get the dimensions of the provided string.
+	 *
+	 * @param text
+	 *            the string.
+	 * @return the dimensions of the provided string.
+	 */
+	private Point getTextDimension(String text) {
+		GC gc = new GC(this);
+		gc.setFont(JFaceResources.getFontRegistry().getBold(
+				JFaceResources.DEFAULT_FONT));
+		Point point = gc.textExtent(text);
+		point.x++;
+		gc.dispose();
+		return point;
+	}
+
+	/**
+	 * Initialize the colours used in the list.
+	 */
+	private void initColours() {
+		/*
+		 * Colour 3 COLOR_LIST_BACKGROUND
+		 */
+		listBackground = Display.getCurrent().getSystemColor(
+				SWT.COLOR_LIST_BACKGROUND);
+
+		/*
+		 * Colour 13 COLOR_WIDGET_BACKGROUND
+		 */
+		widgetBackground = Display.getCurrent().getSystemColor(
+				SWT.COLOR_WIDGET_BACKGROUND);
+
+		/*
+		 * Colour 15 COLOR_WIDGET_DARK_SHADOW
+		 */
+		widgetDarkShadow = Display.getCurrent().getSystemColor(
+				SWT.COLOR_WIDGET_DARK_SHADOW);
+
+		/*
+		 * Colour 16 COLOR_WIDGET_FOREGROUND
+		 */
+		widgetForeground = Display.getCurrent().getSystemColor(
+				SWT.COLOR_WIDGET_FOREGROUND);
+
+		/*
+		 * Colour 19 COLOR_WIDGET_NORMAL_SHADOW
+		 */
+		widgetNormalShadow = Display.getCurrent().getSystemColor(
+				SWT.COLOR_WIDGET_NORMAL_SHADOW);
+
+		RGB infoBackground = Display.getCurrent().getSystemColor(
+				SWT.COLOR_INFO_BACKGROUND).getRGB();
+		RGB white = Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)
+				.getRGB();
+		RGB black = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK)
+				.getRGB();
+
+		/*
+		 * gradient in the default tab: start colour WIDGET_NORMAL_SHADOW 100% +
+		 * white 20% + INFO_BACKGROUND 60% end colour WIDGET_NORMAL_SHADOW 100% +
+		 * INFO_BACKGROUND 40%
+		 */
+		defaultGradientStart = factory.getColors().createColor(
+				"TabbedPropertyList.defaultTabGradientStart", //$NON-NLS-1$
+				FormColors.blend(infoBackground, FormColors.blend(white,
+						widgetNormalShadow.getRGB(), 20), 60));
+		defaultGradientEnd = factory.getColors().createColor(
+				"TabbedPropertyList.defaultTabGradientEnd", //$NON-NLS-1$
+				FormColors.blend(infoBackground, widgetNormalShadow.getRGB(),
+						40));
+
+		navigationElementShadowStroke = factory.getColors().createColor(
+				"TabbedPropertyList.shadowStroke", //$NON-NLS-1$
+				FormColors.blend(white, widgetNormalShadow.getRGB(), 55));
+		bottomNavigationElementShadowStroke1 = factory.getColors().createColor(
+				"TabbedPropertyList.tabShadowStroke1", //$NON-NLS-1$
+				FormColors.blend(black, widgetBackground.getRGB(), 10));
+		bottomNavigationElementShadowStroke2 = factory.getColors().createColor(
+				"TabbedPropertyList.tabShadowStroke2", //$NON-NLS-1$
+				FormColors.blend(black, widgetBackground.getRGB(), 5));
+
+		/*
+		 * gradient in the hover tab: start colour WIDGET_BACKGROUND 100% +
+		 * white 20% end colour WIDGET_BACKGROUND 100% + WIDGET_NORMAL_SHADOW
+		 * 10%
+		 */
+		hoverGradientStart = factory.getColors().createColor(
+				"TabbedPropertyList.hoverBackgroundGradientStart", //$NON-NLS-1$
+				FormColors.blend(white, widgetBackground.getRGB(), 20));
+		hoverGradientEnd = factory.getColors().createColor(
+				"TabbedPropertyList.hoverBackgroundGradientEnd", //$NON-NLS-1$
+				FormColors.blend(widgetNormalShadow.getRGB(), widgetBackground
+						.getRGB(), 10));
+
+		indentedDefaultBackground = factory.getColors().createColor(
+				"TabbedPropertyList.indentedDefaultBackground", //$NON-NLS-1$
+				FormColors.blend(white, widgetBackground.getRGB(), 10));
+		indentedHoverBackground = factory.getColors().createColor(
+				"TabbedPropertyList.indentedHoverBackground", //$NON-NLS-1$
+				FormColors.blend(white, widgetBackground.getRGB(), 75));
+	}
+
+	/**
+	 * Get the height of a tab. The height of the tab is the height of the text
+	 * plus buffer.
+	 *
+	 * @return the height of a tab.
+	 */
+	private int getTabHeight() {
+		int tabHeight = getTextDimension("").y + INDENT; //$NON-NLS-1$
+		if (tabsThatFitInComposite == 1) {
+			/*
+			 * if only one tab will fix, reduce the size of the tab height so
+			 * that the navigation elements fit.
+			 */
+			int ret = getBounds().height - 20;
+			return (ret > tabHeight) ? tabHeight
+				: (ret < 5) ? 5
+					: ret;
+		}
+		return tabHeight;
+	}
+
+	/**
+	 * Determine if a downward scrolling is required.
+	 *
+	 * @return true if downward scrolling is required.
+	 */
+	private boolean isDownScrollRequired() {
+		return elements.length > tabsThatFitInComposite
+			&& bottomVisibleIndex != elements.length - 1;
+	}
+
+	/**
+	 * Determine if an upward scrolling is required.
+	 *
+	 * @return true if upward scrolling is required.
+	 */
+	private boolean isUpScrollRequired() {
+		return elements.length > tabsThatFitInComposite && topVisibleIndex != 0;
+	}
+
+	/**
+	 * Based on available space, figure out the top and bottom tabs in the list.
+	 */
+	private void computeTopAndBottomTab() {
+		computeTabsThatFitInComposite();
+		if (elements.length == 0) {
+			/*
+			 * no tabs to display.
+			 */
+			topVisibleIndex = 0;
+			bottomVisibleIndex = 0;
+		} else if (tabsThatFitInComposite >= elements.length) {
+			/*
+			 * all the tabs fit.
+			 */
+			topVisibleIndex = 0;
+			bottomVisibleIndex = elements.length - 1;
+		} else if (getSelectionIndex() == NONE) {
+			/*
+			 * there is no selected tab yet, assume that tab one would
+			 * be selected for now.
+			 */
+			topVisibleIndex = 0;
+			bottomVisibleIndex = tabsThatFitInComposite - 1;
+		} else if (getSelectionIndex() + tabsThatFitInComposite > elements.length) {
+			/*
+			 * the selected tab is near the bottom.
+			 */
+			bottomVisibleIndex = elements.length - 1;
+			topVisibleIndex = bottomVisibleIndex - tabsThatFitInComposite + 1;
+		} else {
+			/*
+			 * the selected tab is near the top.
+			 */
+			topVisibleIndex = selectedElementIndex;
+			bottomVisibleIndex = selectedElementIndex + tabsThatFitInComposite
+				- 1;
+		}
+		layoutTabs();
+	}
+
+	/**
+	 * Layout the tabs.
+	 */
+	private void layoutTabs() {
+		//System.out.println("TabFit " + tabsThatFitInComposite + " length "
+		//	+ elements.length + " top " + topVisibleIndex + " bottom "
+		//	+ bottomVisibleIndex);
+		if (tabsThatFitInComposite == NONE || elements.length == 0) {
+			FormData formData = new FormData();
+			formData.left = new FormAttachment(0, 0);
+			formData.right = new FormAttachment(100, 0);
+			formData.top = new FormAttachment(0, 0);
+			formData.height = getTabHeight();
+			topNavigationElement.setLayoutData(formData);
+
+			formData = new FormData();
+			formData.left = new FormAttachment(0, 0);
+			formData.right = new FormAttachment(100, 0);
+			formData.top = new FormAttachment(topNavigationElement, 0);
+			formData.bottom = new FormAttachment(100, 0);
+			bottomNavigationElement.setLayoutData(formData);
+		} else {
+
+			FormData formData = new FormData();
+			formData.left = new FormAttachment(0, 0);
+			formData.right = new FormAttachment(100, 0);
+			formData.top = new FormAttachment(0, 0);
+			formData.height = 10;
+			topNavigationElement.setLayoutData(formData);
+
+			/*
+			 * use nextElement to attach the layout to the previous canvas
+			 * widget in the list.
+			 */
+			Canvas nextElement = topNavigationElement;
+
+			for (int i = 0; i < elements.length; i++) {
+				//System.out.print(i + " [" + elements[i].getText() + "]");
+				if (i < topVisibleIndex || i > bottomVisibleIndex) {
+					/*
+					 * this tab is not visible
+					 */
+					elements[i].setLayoutData(null);
+					elements[i].setVisible(false);
+				} else {
+					/*
+					 * this tab is visible.
+					 */
+					//System.out.print(" visible");
+					formData = new FormData();
+					formData.height = getTabHeight();
+					formData.left = new FormAttachment(0, 0);
+					formData.right = new FormAttachment(100, 0);
+					formData.top = new FormAttachment(nextElement, 0);
+					nextElement = elements[i];
+					elements[i].setLayoutData(formData);
+					elements[i].setVisible(true);
+				}
+
+				//if (i == selectedElementIndex) {
+				//	System.out.print(" selected");
+				//}
+				//System.out.println("");
+			}
+			formData = new FormData();
+			formData.left = new FormAttachment(0, 0);
+			formData.right = new FormAttachment(100, 0);
+			formData.top = new FormAttachment(nextElement, 0);
+			formData.bottom = new FormAttachment(100, 0);
+			formData.height = 10;
+			bottomNavigationElement.setLayoutData(formData);
+		}
+		//System.out.println("");
+
+		// layout so that we have enough space for the new labels
+		Composite grandparent = getParent().getParent();
+		grandparent.layout(true);
+		layout(true);
+	}
+
+	/**
+	 * Initialize the accessibility adapter.
+	 */
+	private void initAccessible() {
+		// RAP does not support this
+//		final Accessible accessible = getAccessible();
+//		accessible.addAccessibleListener(new AccessibleAdapter() {
+//
+//			public void getName(AccessibleEvent e) {
+//				if (getSelectionIndex() != NONE) {
+//					e.result = elements[getSelectionIndex()].getTabItem()
+//							.getText();
+//				}
+//			}
+//
+//			public void getHelp(AccessibleEvent e) {
+//				if (getSelectionIndex() != NONE) {
+//					e.result = elements[getSelectionIndex()].getTabItem()
+//							.getText();
+//				}
+//			}
+//		});
+//
+//		accessible.addAccessibleControlListener(new AccessibleControlAdapter() {
+//
+//			public void getChildAtPoint(AccessibleControlEvent e) {
+//				Point pt = toControl(new Point(e.x, e.y));
+//				e.childID = (getBounds().contains(pt)) ? ACC.CHILDID_SELF
+//					: ACC.CHILDID_NONE;
+//			}
+//
+//			public void getLocation(AccessibleControlEvent e) {
+//				if (getSelectionIndex() != NONE) {
+//					Rectangle location = elements[getSelectionIndex()]
+//						.getBounds();
+//					Point pt = toDisplay(new Point(location.x, location.y));
+//					e.x = pt.x;
+//					e.y = pt.y;
+//					e.width = location.width;
+//					e.height = location.height;
+//				}
+//			}
+//
+//			public void getChildCount(AccessibleControlEvent e) {
+//				e.detail = 0;
+//			}
+//
+//			public void getRole(AccessibleControlEvent e) {
+//				e.detail = ACC.ROLE_TABITEM;
+//			}
+//
+//			public void getState(AccessibleControlEvent e) {
+//				e.detail = ACC.STATE_NORMAL | ACC.STATE_SELECTABLE
+//					| ACC.STATE_SELECTED | ACC.STATE_FOCUSED
+//					| ACC.STATE_FOCUSABLE;
+//			}
+//		});
+//
+//		addListener(SWT.Selection, new Listener() {
+//
+//			public void handleEvent(Event event) {
+//				if (isFocusControl()) {
+//					accessible.setFocus(ACC.CHILDID_SELF);
+//				}
+//			}
+//		});
+//
+//		addListener(SWT.FocusIn, new Listener() {
+//
+//			public void handleEvent(Event event) {
+//				accessible.setFocus(ACC.CHILDID_SELF);
+//			}
+//		});
+		// /RAP
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistry.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistry.java
new file mode 100644
index 0000000..2f51aa0
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistry.java
@@ -0,0 +1,561 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+import com.ibm.icu.text.MessageFormat;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewPlugin;
+import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewStatusCodes;
+import org.eclipse.ui.internal.views.properties.tabbed.l10n.TabbedPropertyMessages;
+import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
+import org.eclipse.ui.views.properties.tabbed.IActionProvider;
+import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
+import org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider;
+import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
+import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
+import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
+
+/**
+ * Provides information about the tabbed property extension points. Each tabbed
+ * property registry is associated with a unique contributor ID.
+ *
+ * @author Anthony Hunter
+ */
+public class TabbedPropertyRegistry {
+
+	private final static String NO_TAB_ERROR = TabbedPropertyMessages.TabbedPropertyRegistry_Non_existing_tab;
+
+	private final static String CONTRIBUTOR_ERROR = TabbedPropertyMessages.TabbedPropertyRegistry_contributor_error;
+
+	private final static String TAB_ERROR = TabbedPropertyMessages.TabDescriptor_Tab_unknown_category;
+
+	// extension point constants
+	private static final String EXTPT_CONTRIBUTOR = "propertyContributor"; //$NON-NLS-1$
+
+	private static final String EXTPT_TABS = "propertyTabs"; //$NON-NLS-1$
+
+	private static final String EXTPT_SECTIONS = "propertySections"; //$NON-NLS-1$
+
+	private static final String ELEMENT_TAB = "propertyTab"; //$NON-NLS-1$
+
+	private static final String ELEMENT_SECTION = "propertySection"; //$NON-NLS-1$
+
+	private static final String ELEMENT_PROPERTY_CATEGORY = "propertyCategory"; //$NON-NLS-1$
+
+	private static final String ATT_CATEGORY = "category"; //$NON-NLS-1$
+
+	private static final String ATT_CONTRIBUTOR_ID = "contributorId"; //$NON-NLS-1$
+
+	private static final String ATT_TYPE_MAPPER = "typeMapper"; //$NON-NLS-1$
+
+	private static final String ATT_LABEL_PROVIDER = "labelProvider"; //$NON-NLS-1$
+
+	private static final String ATT_ACTION_PROVIDER = "actionProvider"; //$NON-NLS-1$
+
+	private static final String ATT_SECTION_DESCRIPTOR_PROVIDER = "sectionDescriptorProvider"; //$NON-NLS-1$
+
+	private static final String ATT_TAB_DESCRIPTOR_PROVIDER = "tabDescriptorProvider"; //$NON-NLS-1$
+
+	private static final String ATT_OVERRIDABLE_TAB_LIST_CONTENT_PROVIDER = "overridableTabListContentProvider"; //$NON-NLS-1$
+
+	private static final String TOP = "top"; //$NON-NLS-1$
+
+	protected String contributorId;
+
+	protected IConfigurationElement contributorConfigurationElement;
+
+	protected List propertyCategories;
+
+	protected ILabelProvider labelProvider;
+
+	protected IActionProvider actionProvider;
+
+	protected ITypeMapper typeMapper;
+
+	protected ISectionDescriptorProvider sectionDescriptorProvider;
+
+	protected ITabDescriptorProvider tabDescriptorProvider;
+
+	protected ITabDescriptor[] tabDescriptors;
+
+	protected static final AbstractTabDescriptor[] EMPTY_DESCRIPTOR_ARRAY = new TabDescriptor[0];
+
+	protected boolean overridableTabListContentProvider = false;
+
+	/**
+	 * There is one details registry for each contributor type.
+	 */
+	protected TabbedPropertyRegistry(String id) {
+		this.contributorId = id;
+		this.propertyCategories = new ArrayList();
+		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_CONTRIBUTOR);
+		for (int i = 0; i < extensions.length; i++) {
+			IConfigurationElement configurationElement = extensions[i];
+			String contributor = configurationElement
+					.getAttribute(ATT_CONTRIBUTOR_ID);
+			if (contributor == null || !id.equals(contributor)) {
+				continue;
+			}
+			this.contributorConfigurationElement = configurationElement;
+			try {
+				if (configurationElement.getAttribute(ATT_LABEL_PROVIDER) != null) {
+					labelProvider = (ILabelProvider) configurationElement
+							.createExecutableExtension(ATT_LABEL_PROVIDER);
+				}
+				if (configurationElement.getAttribute(ATT_ACTION_PROVIDER) != null) {
+					actionProvider = (IActionProvider) configurationElement
+							.createExecutableExtension(ATT_ACTION_PROVIDER);
+				}
+				if (configurationElement.getAttribute(ATT_TYPE_MAPPER) != null) {
+					typeMapper = (ITypeMapper) configurationElement
+							.createExecutableExtension(ATT_TYPE_MAPPER);
+				}
+				if (configurationElement
+						.getAttribute(ATT_SECTION_DESCRIPTOR_PROVIDER) != null) {
+					sectionDescriptorProvider = (ISectionDescriptorProvider) configurationElement
+							.createExecutableExtension(ATT_SECTION_DESCRIPTOR_PROVIDER);
+				}
+				if (configurationElement
+						.getAttribute(ATT_TAB_DESCRIPTOR_PROVIDER) != null) {
+					tabDescriptorProvider = (ITabDescriptorProvider) configurationElement
+							.createExecutableExtension(ATT_TAB_DESCRIPTOR_PROVIDER);
+				}
+				if (configurationElement
+						.getAttribute(ATT_OVERRIDABLE_TAB_LIST_CONTENT_PROVIDER) != null) {
+					String attributeBoolean = configurationElement
+							.getAttribute(ATT_OVERRIDABLE_TAB_LIST_CONTENT_PROVIDER);
+					overridableTabListContentProvider = attributeBoolean
+							.equals("true");//$NON-NLS-1$
+				}
+			} catch (CoreException exception) {
+				handleConfigurationError(id, exception);
+			}
+			addPropertyCategories(configurationElement);
+		}
+		if (propertyCategories == null || contributorId == null ||
+				contributorConfigurationElement == null) {
+			handleConfigurationError(id, null);
+			this.contributorId = null;
+		}
+	}
+
+	/**
+	 * Gets the categories that are valid for this contributor.
+	 *
+	 * @param configurationElement
+	 *            the configuration element for this contributor.
+	 */
+	private void addPropertyCategories(
+			IConfigurationElement configurationElement) {
+		IConfigurationElement[] elements = configurationElement
+				.getChildren(ELEMENT_PROPERTY_CATEGORY);
+		for (int i = 0; i < elements.length; i++) {
+			IConfigurationElement element = elements[i];
+			propertyCategories.add(element.getAttribute(ATT_CATEGORY));
+		}
+	}
+
+	/**
+	 * Handle the error when an issue is found loading from the configuration
+	 * element.
+	 *
+	 * @param id
+	 *            the configuration id.
+	 * @param exception
+	 *            an optional CoreException
+	 */
+	private void handleConfigurationError(String id, CoreException exception) {
+		String message = MessageFormat.format(CONTRIBUTOR_ERROR,
+				new Object[] { id });
+		IStatus status = new Status(IStatus.ERROR, TabbedPropertyViewPlugin
+				.getPlugin().getBundle().getSymbolicName(),
+				TabbedPropertyViewStatusCodes.CONTRIBUTOR_ERROR, message,
+				exception);
+		TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
+	}
+
+	/**
+	 * Reads property section extensions. Returns all section descriptors for
+	 * the current contributor id or an empty array if none is found.
+	 */
+	protected ISectionDescriptor[] readSectionDescriptors() {
+		List result = new ArrayList();
+		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_SECTIONS);
+		for (int i = 0; i < extensions.length; i++) {
+			IConfigurationElement extension = extensions[i];
+			IConfigurationElement[] sections = extension
+					.getChildren(ELEMENT_SECTION);
+			for (int j = 0; j < sections.length; j++) {
+				IConfigurationElement section = sections[j];
+				ISectionDescriptor descriptor = new SectionDescriptor(section,
+						typeMapper);
+				result.add(descriptor);
+			}
+		}
+		return (ISectionDescriptor[]) result
+				.toArray(new ISectionDescriptor[result.size()]);
+	}
+
+	/**
+	 * Returns the configuration elements targeted for the given extension point
+	 * and the current contributor id. The elements are also sorted by plugin
+	 * prerequisite order.
+	 */
+	protected IConfigurationElement[] getConfigurationElements(
+			String extensionPointId) {
+		if (contributorId == null) {
+			return new IConfigurationElement[0];
+		}
+		// RAP modified to use 'org.eclipse.ui.views.properties.tabbed' namespace
+		IExtensionPoint point = Platform.getExtensionRegistry()
+				.getExtensionPoint(
+						"org.eclipse.ui.views.properties.tabbed", extensionPointId); //$NON-NLS-1$
+		IConfigurationElement[] extensions = point.getConfigurationElements();
+		List unordered = new ArrayList(extensions.length);
+		for (int i = 0; i < extensions.length; i++) {
+			IConfigurationElement extension = extensions[i];
+			if (!extension.getName().equals(extensionPointId)) {
+				continue;
+			}
+			String contributor = extension.getAttribute(ATT_CONTRIBUTOR_ID);
+			if (!contributorId.equals(contributor)) {
+				continue;
+			}
+			unordered.add(extension);
+		}
+		return (IConfigurationElement[]) unordered
+				.toArray(new IConfigurationElement[unordered.size()]);
+	}
+
+	/**
+	 * Returns the index of the given element in the array.
+	 */
+	private int getIndex(Object[] array, Object target) {
+		for (int i = 0; i < array.length; i++) {
+			if (array[i].equals(target)) {
+				return i;
+			}
+		}
+		return -1; // should never happen
+	}
+
+	/**
+	 * Returns all section descriptors for the provided selection.
+	 *
+	 * @param part
+	 *            the workbench part containing the selection
+	 * @param selection
+	 *            the current selection.
+	 * @return all section descriptors.
+	 */
+	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part,
+			ISelection selection) {
+		if (selection == null || selection.isEmpty()) {
+			return EMPTY_DESCRIPTOR_ARRAY;
+		}
+
+		ITabDescriptor[] allDescriptors = null;
+		if (tabDescriptorProvider == null) {
+			allDescriptors = getAllTabDescriptors();
+		} else {
+			allDescriptors = tabDescriptorProvider.getTabDescriptors(part,
+					selection);
+		}
+
+		ITabDescriptor[] result = filterTabDescriptors(allDescriptors, part,
+				selection);
+		return result;
+	}
+
+	/**
+	 * Filters out the tab descriptors that do not have any sections for the
+	 * given input.
+	 */
+	protected ITabDescriptor[] filterTabDescriptors(
+			ITabDescriptor[] descriptors, IWorkbenchPart part,
+			ISelection selection) {
+		List result = new ArrayList();
+		for (int i = 0; i < descriptors.length; i++) {
+			ITabDescriptor descriptor = adaptDescriptorFor(descriptors[i],
+					part, selection);
+			if (!descriptor.getSectionDescriptors().isEmpty()) {
+				result.add(descriptor);
+			}
+		}
+		if (result.size() == 0) {
+			return EMPTY_DESCRIPTOR_ARRAY;
+		}
+		return (ITabDescriptor[]) result.toArray(new ITabDescriptor[result
+				.size()]);
+	}
+
+	/**
+	 * Given a property tab descriptor remove all its section descriptors that
+	 * do not apply to the given input object.
+	 */
+	protected ITabDescriptor adaptDescriptorFor(ITabDescriptor target,
+			IWorkbenchPart part, ISelection selection) {
+		List filteredSectionDescriptors = new ArrayList();
+		List descriptors = target.getSectionDescriptors();
+		for (Iterator iter = descriptors.iterator(); iter.hasNext();) {
+			ISectionDescriptor descriptor = (ISectionDescriptor) iter.next();
+			if (descriptor.appliesTo(part, selection)) {
+				filteredSectionDescriptors.add(descriptor);
+			}
+		}
+		AbstractTabDescriptor result = (AbstractTabDescriptor) ((AbstractTabDescriptor) target)
+				.clone();
+		result.setSectionDescriptors(filteredSectionDescriptors);
+		return result;
+	}
+
+	/**
+	 * Reads property tab extensions. Returns all tab descriptors for the
+	 * current contributor id or an empty array if none is found.
+	 */
+	protected ITabDescriptor[] getAllTabDescriptors() {
+		if (tabDescriptors == null) {
+			List temp = readTabDescriptors();
+			populateWithSectionDescriptors(temp);
+			temp = sortTabDescriptorsByCategory(temp);
+			temp = sortTabDescriptorsByAfterTab(temp);
+			tabDescriptors = (TabDescriptor[]) temp
+					.toArray(new TabDescriptor[temp.size()]);
+		}
+		return tabDescriptors;
+	}
+
+	/**
+	 * Reads property tab extensions. Returns all tab descriptors for the
+	 * current contributor id or an empty list if none is found.
+	 */
+	protected List readTabDescriptors() {
+		List result = new ArrayList();
+		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_TABS);
+		for (int i = 0; i < extensions.length; i++) {
+			IConfigurationElement extension = extensions[i];
+			IConfigurationElement[] tabs = extension.getChildren(ELEMENT_TAB);
+			for (int j = 0; j < tabs.length; j++) {
+				IConfigurationElement tab = tabs[j];
+				TabDescriptor descriptor = new TabDescriptor(tab);
+				if (getIndex(propertyCategories.toArray(), descriptor
+						.getCategory()) == -1) {
+					/* tab descriptor has unknown category */
+					handleTabError(tab, descriptor.getCategory() == null ? "" //$NON-NLS-1$
+							: descriptor.getCategory());
+				} else {
+					result.add(descriptor);
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Populates the given tab descriptors with section descriptors.
+	 */
+	protected void populateWithSectionDescriptors(List aTabDescriptors) {
+		ISectionDescriptor[] sections = null;
+		if (sectionDescriptorProvider != null) {
+			sections = sectionDescriptorProvider.getSectionDescriptors();
+		} else {
+			sections = readSectionDescriptors();
+		}
+		for (int i = 0; i < sections.length; i++) {
+			ISectionDescriptor section = sections[i];
+			appendToTabDescriptor(section, aTabDescriptors);
+		}
+	}
+
+	/**
+	 * Appends the given section to a tab from the list.
+	 */
+	protected void appendToTabDescriptor(ISectionDescriptor section,
+			List aTabDescriptors) {
+		for (Iterator i = aTabDescriptors.iterator(); i.hasNext();) {
+			TabDescriptor tab = (TabDescriptor) i.next();
+			if (tab.append(section)) {
+				return;
+			}
+		}
+		// could not append the section to any of the existing tabs - log error
+		String message = MessageFormat.format(NO_TAB_ERROR, new Object[] {
+				section.getId(), section.getTargetTab() });
+		IStatus status = new Status(IStatus.ERROR, TabbedPropertyViewPlugin
+				.getPlugin().getBundle().getSymbolicName(),
+				TabbedPropertyViewStatusCodes.NO_TAB_ERROR, message, null);
+		TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
+	}
+
+	/**
+	 * Sorts the tab descriptors in the given list according to category.
+	 */
+	protected List sortTabDescriptorsByCategory(List descriptors) {
+		Collections.sort(descriptors, new Comparator() {
+
+			public int compare(Object arg0, Object arg1) {
+				TabDescriptor one = (TabDescriptor) arg0;
+				TabDescriptor two = (TabDescriptor) arg1;
+				String categoryOne = one.getCategory();
+				String categoryTwo = two.getCategory();
+				int categoryOnePosition = getIndex(
+						propertyCategories.toArray(), categoryOne);
+				int categoryTwoPosition = getIndex(
+						propertyCategories.toArray(), categoryTwo);
+				return categoryOnePosition - categoryTwoPosition;
+			}
+		});
+		return descriptors;
+	}
+
+	/**
+	 * Sorts the tab descriptors in the given list according to afterTab.
+	 */
+	protected List sortTabDescriptorsByAfterTab(List tabs) {
+		if (tabs.size() == 0 || propertyCategories == null) {
+			return tabs;
+		}
+		List sorted = new ArrayList();
+		int categoryIndex = 0;
+		for (int i = 0; i < propertyCategories.size(); i++) {
+			List categoryList = new ArrayList();
+			String category = (String) propertyCategories.get(i);
+			int topOfCategory = categoryIndex;
+			int endOfCategory = categoryIndex;
+			while (endOfCategory < tabs.size() &&
+					((TabDescriptor) tabs.get(endOfCategory)).getCategory()
+							.equals(category)) {
+				endOfCategory++;
+			}
+			for (int j = topOfCategory; j < endOfCategory; j++) {
+				TabDescriptor tab = (TabDescriptor) tabs.get(j);
+				if (tab.getAfterTab().equals(TOP)) {
+					categoryList.add(0, tabs.get(j));
+				} else {
+					categoryList.add(tabs.get(j));
+				}
+			}
+			Collections.sort(categoryList, new Comparator() {
+
+				public int compare(Object arg0, Object arg1) {
+					TabDescriptor one = (TabDescriptor) arg0;
+					TabDescriptor two = (TabDescriptor) arg1;
+					if (two.getAfterTab().equals(one.getId())) {
+						return -1;
+					} else if (one.getAfterTab().equals(two.getId())) {
+						return 1;
+					} else {
+						return 0;
+					}
+				}
+			});
+			for (int j = 0; j < categoryList.size(); j++) {
+				sorted.add(categoryList.get(j));
+			}
+			categoryIndex = endOfCategory;
+		}
+		return sorted;
+	}
+
+	/**
+	 * Gets the type mapper for the contributor.
+	 *
+	 * @return the type mapper for the contributor.
+	 */
+	public ITypeMapper getTypeMapper() {
+		return typeMapper;
+	}
+
+	/**
+	 * Gets the label provider for the contributor.
+	 *
+	 * @return the label provider for the contributor.
+	 */
+	public ILabelProvider getLabelProvider() {
+		return labelProvider;
+	}
+
+	/**
+	 * Gets the action provider for the contributor.
+	 *
+	 * @return the action provider for the contributor.
+	 */
+	public IActionProvider getActionProvider() {
+		return actionProvider;
+	}
+
+	/**
+	 * Gets the tab list content provider for the contributor.
+	 *
+	 * @return the tab list content provider for the contributor.
+	 */
+	public IStructuredContentProvider getTabListContentProvider() {
+		if (overridableTabListContentProvider) {
+			return new OverridableTabListContentProvider(this);
+		}
+		return new TabListContentProvider(this);
+	}
+
+	/**
+	 * Handle the tab error when an issue is found loading from the
+	 * configuration element.
+	 *
+	 * @param configurationElement
+	 *            the configuration element
+	 */
+	private void handleTabError(IConfigurationElement configurationElement,
+			String category) {
+		String pluginId = configurationElement.getDeclaringExtension()
+				.getNamespaceIdentifier();
+		String message = MessageFormat.format(TAB_ERROR, new Object[] {
+				pluginId, category });
+		IStatus status = new Status(IStatus.ERROR, pluginId,
+				TabbedPropertyViewStatusCodes.TAB_ERROR, message, null);
+		TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
+	}
+
+	/**
+	 * Disposes this registry.
+	 *
+	 * @since 3.7
+	 */
+	public void dispose() {
+		if (labelProvider != null) {
+			labelProvider.dispose();
+			labelProvider = null;
+		}
+
+		if (tabDescriptors != null) {
+			for (int i= 0; i < tabDescriptors.length; i++) {
+				if (tabDescriptors[i] instanceof TabDescriptor)
+					((TabDescriptor)tabDescriptors[i]).dispose();
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryClassSectionFilter.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryClassSectionFilter.java
new file mode 100644
index 0000000..60119c2
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryClassSectionFilter.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.viewers.IFilter;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
+import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
+
+/**
+ * Provides a section filtering mechanism where the selection is an
+ * IStructuredSelection and filtering is based on class.
+ * 
+ * @author Anthony Hunter
+ */
+public class TabbedPropertyRegistryClassSectionFilter {
+
+	private ITypeMapper typeMapper = null;
+
+	/**
+	 * Constructor for TabbedPropertyRegistryClassSectionFilter
+	 * 
+	 * @param typeMapper
+	 *            the type mapper.
+	 */
+	public TabbedPropertyRegistryClassSectionFilter(ITypeMapper typeMapper) {
+		super();
+		this.typeMapper = typeMapper;
+	}
+
+	/**
+	 * Verifies if the property section extension represented by sectionElement
+	 * applies to the given input.
+	 * 
+	 * @param descriptor
+	 *            the section descriptor.
+	 * @param selection
+	 *            the selection.
+	 * @return <code>true</code> if this section applies to the current
+	 *         selection.
+	 */
+	public boolean appliesToSelection(ISectionDescriptor descriptor,
+			ISelection selection) {
+
+		if (selection instanceof IStructuredSelection &&
+				selection.isEmpty() == false) {
+
+			if (descriptor.getEnablesFor() != ISectionDescriptor.ENABLES_FOR_ANY &&
+					((IStructuredSelection) selection).size() != descriptor
+							.getEnablesFor()) {
+				/**
+				 * enablesFor does not match the size of the selection, do not
+				 * display section.
+				 */
+				return false;
+			}
+
+			IFilter filter = descriptor.getFilter();
+
+			if (filter != null) {
+				for (Iterator i = ((IStructuredSelection) selection).iterator(); i
+						.hasNext();) {
+					Object object = i.next();
+
+					if (filter != null && filter.select(object) == false) {
+						/**
+						 * filter fails so section does not apply to the
+						 * selection, do not display section.
+						 */
+						return false;
+					}
+				}
+				/**
+				 * filter passes for all objects in the selection.
+				 */
+				return true;
+			}
+
+			Set effectiveTypes = new HashSet();
+
+			for (Iterator i = ((IStructuredSelection) selection).iterator(); i
+					.hasNext();) {
+
+				Object object = i.next();
+
+				Class remapType = object.getClass();
+				if (typeMapper != null) {
+					remapType = typeMapper.mapType(object);
+				}
+
+				if (effectiveTypes.add(remapType)) {
+
+					// the effective types of the selection
+					if (appliesToEffectiveType(descriptor, remapType) == false) {
+						return false;
+					}
+				}
+			}
+		} else {
+			/* Bug 245690 selection is not a IStructuredSelection */
+			if (descriptor.getFilter() != null) {
+				return descriptor.getFilter().select(selection);
+			}
+		}
+
+		return true;
+	}
+
+	private boolean appliesToEffectiveType(ISectionDescriptor descriptor,
+			Class inputClass) {
+
+		ArrayList classTypes = getClassTypes(inputClass);
+
+		List sectionInputTypes = descriptor.getInputTypes();
+		for (Iterator j = sectionInputTypes.iterator(); j.hasNext();) {
+			String type = (String) j.next();
+			if (classTypes.contains(type)) {
+				// found a match
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Returns the classes and interfaces the given target class
+	 * extends/implements.
+	 */
+	protected ArrayList getClassTypes(Class target) {
+		ArrayList result = new ArrayList();
+		// add classes
+		List classes = computeClassOrder(target);
+		for (Iterator i = classes.iterator(); i.hasNext();) {
+			result.add(((Class) i.next()).getName());
+		}
+		// add interfaces
+		result.addAll(computeInterfaceOrder(classes));
+		return result;
+	}
+
+	private List computeClassOrder(Class target) {
+		List result = new ArrayList(4);
+		Class clazz = target;
+		while (clazz != null) {
+			result.add(clazz);
+			clazz = clazz.getSuperclass();
+		}
+		return result;
+	}
+
+	private List computeInterfaceOrder(List classes) {
+		List result = new ArrayList(4);
+		Map seen = new HashMap(4);
+		for (Iterator iter = classes.iterator(); iter.hasNext();) {
+			Class[] interfaces = ((Class) iter.next()).getInterfaces();
+			internalComputeInterfaceOrder(interfaces, result, seen);
+		}
+		return result;
+	}
+
+	private void internalComputeInterfaceOrder(Class[] interfaces, List result,
+			Map seen) {
+		List newInterfaces = new ArrayList(seen.size());
+		for (int i = 0; i < interfaces.length; i++) {
+			Class interfac = interfaces[i];
+			if (seen.get(interfac) == null) {
+				result.add(interfac.getName());
+				seen.put(interfac, interfac);
+				newInterfaces.add(interfac);
+			}
+		}
+		for (Iterator iter = newInterfaces.iterator(); iter.hasNext();) {
+			internalComputeInterfaceOrder(
+					((Class) iter.next()).getInterfaces(), result, seen);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryFactory.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryFactory.java
new file mode 100644
index 0000000..60cf094
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryFactory.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2011 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
+
+/**
+ * tabbed property registry factory. Caches the tabbed property registry by
+ * tabbed property contributor ID.
+ * 
+ * @author Anthony Hunter
+ */
+public class TabbedPropertyRegistryFactory {
+
+	class CacheData {
+		TabbedPropertyRegistry registry;
+		List references;
+	}
+
+	/**
+	 * singleton instance of this class
+	 */
+	private static TabbedPropertyRegistryFactory INSTANCE = new TabbedPropertyRegistryFactory();
+
+	/**
+	 * get the singleton instance of this class.
+	 * 
+	 * @return the TabbedPropertyRegistryFactory instance.
+	 */
+	public static TabbedPropertyRegistryFactory getInstance() {
+		return INSTANCE;
+	}
+
+	/**
+	 * private constructor.
+	 */
+	private TabbedPropertyRegistryFactory() {
+		super();
+		idToCacheData = new HashMap();
+	}
+
+	protected Map idToCacheData; // cache
+
+	/**
+	 * Creates a registry for the given contributor.
+	 * 
+	 * @param target
+	 *            the contributor.
+	 * @return a registry for the given contributor.
+	 */
+	public TabbedPropertyRegistry createRegistry(
+			ITabbedPropertySheetPageContributor target) {
+		/**
+		 * Get the contributor id from the ITabbedPropertySheetPageContributor
+		 * interface
+		 */
+		String key = target.getContributorId();
+		CacheData data = (CacheData) idToCacheData.get(key);
+		if (data == null) {
+			data = new CacheData();
+			data.registry = new TabbedPropertyRegistry(key);
+			data.references = new ArrayList(5);
+			idToCacheData.put(key, data);
+		}
+		data.references.add(target);
+		// keeps track of contributor using the same registry
+		return data.registry;
+	}
+
+	/**
+	 * Indicates that the given contributor no longer needs a registry. The
+	 * registry will be disposed when no other contributor of the same type
+	 * needs it.
+	 * 
+	 * @param target
+	 *            the contributor;
+	 */
+	public void disposeRegistry(ITabbedPropertySheetPageContributor target) {
+		/**
+		 * Get the contributor id from the ITabbedPropertySheetPageContributor
+		 * interface
+		 */
+		String key = target.getContributorId();
+		CacheData data = (CacheData) idToCacheData.get(key);
+		if (data != null) {
+			data.references.remove(target);
+			if (data.references.isEmpty()) {
+				data.registry.dispose();
+				idToCacheData.remove(key);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyTitle.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyTitle.java
new file mode 100644
index 0000000..457a135
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyTitle.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+
+
+/**
+ * The title in the tabbed property sheet page.
+ *
+ * @author Anthony Hunter
+ */
+public class TabbedPropertyTitle
+	extends Composite {
+
+	private CLabel label;
+
+//	private Image image = null;
+
+//	private String text = null;
+
+	private static final String BLANK = ""; //$NON-NLS-1$
+
+	private static final String TITLE_FONT = "org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyTitle"; //$NON-NLS-1$
+
+	private TabbedPropertySheetWidgetFactory factory;
+
+	/**
+	 * Constructor for TabbedPropertyTitle.
+	 *
+	 * @param parent
+	 *            the parent composite.
+	 * @param factory
+	 *            the widget factory for the tabbed property sheet
+	 */
+	public TabbedPropertyTitle(Composite parent,
+			TabbedPropertySheetWidgetFactory factory) {
+		super(parent, SWT.NO_FOCUS);
+		this.factory = factory;
+
+		// RAP not suppported
+//		this.addPaintListener(new PaintListener() {
+//
+//			public void paintControl(PaintEvent e) {
+//				if (image == null && (text == null || text.equals(BLANK))) {
+//					label.setVisible(false);
+//				} else {
+//					label.setVisible(true);
+//					drawTitleBackground(e);
+//				}
+//			}
+//		});
+		// /RAP
+
+		factory.getColors().initializeSectionToolBarColors();
+		setBackground(factory.getColors().getBackground());
+		setForeground(factory.getColors().getForeground());
+
+		FormLayout layout = new FormLayout();
+		layout.marginWidth = 1;
+		layout.marginHeight = 2;
+		setLayout(layout);
+
+		Font font;
+		if (! JFaceResources.getFontRegistry().hasValueFor(TITLE_FONT)) {
+			FontData[] fontData = JFaceResources.getFontRegistry().getBold(
+					JFaceResources.DEFAULT_FONT).getFontData();
+			/* title font is 2pt larger than that used in the tabs. */
+			fontData[0].setHeight(fontData[0].getHeight() + 2);
+			JFaceResources.getFontRegistry().put(TITLE_FONT, fontData);
+		}
+		font = JFaceResources.getFont(TITLE_FONT);
+
+		label = factory.createCLabel(this, BLANK);
+//		label.setBackground(new Color[] {
+//				factory.getColors().getColor(IFormColors.H_GRADIENT_END),
+//				factory.getColors().getColor(IFormColors.H_GRADIENT_START) },
+//				new int[] { 100 }, true);
+		label.setFont(font);
+		label.setForeground(factory.getColors().getColor(IFormColors.TITLE));
+		FormData data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.top = new FormAttachment(0, 0);
+		data.right = new FormAttachment(100, 0);
+		data.bottom = new FormAttachment(100, 0);
+		label.setLayoutData(data);
+
+		/*
+		 * setImage(PlatformUI.getWorkbench().getSharedImages().getImage(
+		 * ISharedImages.IMG_OBJ_ELEMENT));
+		 */
+	}
+
+	/**
+	 * @param e
+	 */
+	protected void drawTitleBackground(PaintEvent e) {
+		Rectangle bounds = getClientArea();
+//		label.setBackground(new Color[] {
+//				factory.getColors().getColor(IFormColors.H_GRADIENT_END),
+//				factory.getColors().getColor(IFormColors.H_GRADIENT_START) },
+//				new int[] { 100 }, true);
+		Color bg = factory.getColors().getColor(IFormColors.H_GRADIENT_END);
+		Color gbg = factory.getColors().getColor(IFormColors.H_GRADIENT_START);
+		GC gc = e.gc;
+		gc.setForeground(bg);
+		gc.setBackground(gbg);
+		gc.fillGradientRectangle(bounds.x, bounds.y, bounds.width,
+				bounds.height, true);
+		// background bottom separator
+		gc.setForeground(factory.getColors().getColor(
+				IFormColors.H_BOTTOM_KEYLINE1));
+		gc.drawLine(bounds.x, bounds.height - 2, bounds.x + bounds.width - 1,
+				bounds.height - 2);
+		gc.setForeground(factory.getColors().getColor(
+				IFormColors.H_BOTTOM_KEYLINE2));
+		gc.drawLine(bounds.x, bounds.height - 1, bounds.x + bounds.width - 1,
+				bounds.height - 1);
+	}
+
+	/**
+	 * Set the text label.
+	 *
+	 * @param text
+	 *            the text label.
+	 * @param image
+	 *            the image for the label.
+	 */
+	public void setTitle(String text, Image image) {
+//		this.text = text;
+//		this.image = image;
+		if (text != null) {
+			label.setText(text);
+		} else {
+			label.setText(BLANK);
+		}
+		label.setImage(image);
+		redraw();
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyViewer.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyViewer.java
new file mode 100644
index 0000000..5c5da17
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyViewer.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.views.properties.tabbed.view;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Viewer representing the property sheet page. On the left side it 
+ * contains a list of tabs and on the right side it contains the
+ * current selected tab.
+ * 
+ * @author Anthony Hunter 
+ */
+public class TabbedPropertyViewer extends StructuredViewer {
+
+	protected TabbedPropertyList list;
+	protected List elements;
+	protected IWorkbenchPart part;
+
+	/**
+	 * Constructor for TabbedPropertyViewer.
+	 * 
+	 * @param list
+	 *            the TabbedPropertyList.
+	 */
+	public TabbedPropertyViewer(TabbedPropertyList list) {
+		this.list = list;
+		hookControl(list);
+		elements = new ArrayList();
+	}
+
+	/**
+	 * Returns the element with the given index from this list viewer.
+	 * Returns <code>null</code> if the index is out of range.
+	 *
+	 * @param index the zero-based index
+	 * @return the element at the given index, or <code>null</code> if the
+	 *   index is out of range
+	 */
+	public Object getElementAt(int index) {
+		if (index >= 0 && index < elements.size()) {
+			return elements.get(index);
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the zero-relative index of the item which is currently
+	 * selected in the receiver, or -1 if no item is selected.
+	 *
+	 * @return the index of the selected item
+	 */
+	public int getSelectionIndex() {
+		return list.getSelectionIndex();
+	}
+
+	protected Widget doFindInputItem(Object element) {
+		/* not implemented */
+		return null;
+	}
+
+	protected Widget doFindItem(Object element) {
+		/* not implemented */
+		return null;
+	}
+
+	protected void doUpdateItem(Widget item, Object element, boolean fullMap) {
+		/* not implemented */
+	}
+
+	protected List getSelectionFromWidget() {
+		int index = list.getSelectionIndex();
+		if (index == TabbedPropertyList.NONE) {
+			return Collections.EMPTY_LIST;
+		}
+		List result = new ArrayList(1);
+		result.add(getElementAt(index));
+		return result;
+	}
+
+	protected void internalRefresh(Object element) {
+		/* not implemented */
+	}
+
+	public void reveal(Object element) {
+		/* not implemented */
+	}
+
+	/**
+	 * We do not consider multiple selections. Only the first
+	 * element will represent the selection.
+	 */
+	protected void setSelectionToWidget(List l, boolean reveal) {
+		if (l == null || l.size() == 0) { // clear selection
+			list.deselectAll();
+		} else {
+			Object object = l.get(0);
+			int index = -1;
+			for (int i = 0; i < elements.size(); i++) {
+				if (elements.get(i) == object) {
+					index = i;
+				}
+			}
+			Assert.isTrue(index != -1, "Could not set the selected tab in the tabbed property viewer");//$NON-NLS-1$
+			list.select(index);
+		}
+	}
+
+	public Control getControl() {
+		return list;
+	}
+
+	protected void inputChanged(Object input, Object oldInput) {
+		elements.clear();
+		Object[] children = getSortedChildren(getRoot());
+		list.removeAll();
+		for (int i = 0; i < children.length; i++) {
+			elements.add(children[i]);
+			mapElement(children[i], list);
+		}
+		list.setElements(children);
+	}
+
+	/**
+	 * Set the input for viewer.
+	 * 
+	 * @param part
+	 *            the workbench part.
+	 * @param selection
+	 *            the selection in the workbench part.
+	 */
+	public void setInput(IWorkbenchPart part, ISelection selection) {
+		this.part = part;
+		setInput(selection);
+	}
+
+	/**
+	 * Get the current workbench part.
+	 * 
+	 * @return the current workbench part.
+	 */
+	public IWorkbenchPart getWorkbenchPart() {
+		return part;
+	}
+
+	/**
+	 * Returns the elements in this list viewer.
+
+	 * @return the elements in this list viewer.
+	 * @since 3.5
+	 */
+	public List getElements() {
+		return elements;
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractOverridableTabListPropertySection.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractOverridableTabListPropertySection.java
new file mode 100644
index 0000000..1b8b45a
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractOverridableTabListPropertySection.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+/**
+ * An abstract implementation of a section in a tab that overrides the tabs that
+ * are provided by the tabbed property registry with a new list of tabs.
+ * 
+ * @author Anthony Hunter
+ * @since 3.4
+ */
+public class AbstractOverridableTabListPropertySection
+	extends AbstractPropertySection
+	implements IOverridableTabList {
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.views.properties.tabbed.IOverridableTabList#getTabs()
+	 */
+	public ITabItem[] getTabs() {
+		return new ITabItem[] {};
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.views.properties.tabbed.IOverridableTabList#selectTab(int)
+	 */
+	public void selectTab(int tab) {
+		/* no default implementation */
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractPropertySection.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractPropertySection.java
new file mode 100644
index 0000000..ae5276e
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractPropertySection.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * An abstract implementation of a section in a tab in the tabbed property sheet
+ * page.
+ * 
+ * @author Anthony Hunter
+ */
+public abstract class AbstractPropertySection
+	implements ISection {
+
+	/**
+	 * The standard label width when labels for sections line up on the left
+	 * hand side of the composite.
+	 */
+	public static final int STANDARD_LABEL_WIDTH = 85;
+
+	/**
+	 * The tabbed property sheet page
+	 */
+	private TabbedPropertySheetPage tabbedPropertySheetPage;
+
+	/**
+	 * The current workbench selection.
+	 */
+	private ISelection selection;
+
+	/**
+	 * The current active workbench part.
+	 */
+	private IWorkbenchPart part;
+
+	/**
+	 * Get the widget factory for the property sheet page.
+	 * 
+	 * @return the widget factory.
+	 */
+	public TabbedPropertySheetWidgetFactory getWidgetFactory() {
+		return tabbedPropertySheetPage.getWidgetFactory();
+	}
+
+	/**
+	 * Get the current workbench selection.
+	 * 
+	 * @return the current workbench selection.
+	 */
+	public ISelection getSelection() {
+		return selection;
+	}
+
+	/**
+	 * @return Returns the part.
+	 */
+	public IWorkbenchPart getPart() {
+		return part;
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#createControls(org.eclipse.swt.widgets.Composite,
+	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
+	 */
+	public void createControls(Composite parent,
+			TabbedPropertySheetPage aTabbedPropertySheetPage) {
+		this.tabbedPropertySheetPage = aTabbedPropertySheetPage;
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public void setInput(IWorkbenchPart part, ISelection selection) {
+		this.selection = selection;
+		this.part = part;
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#aboutToBeShown()
+	 */
+	public void aboutToBeShown() {
+		/* empty default implementation */
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#aboutToBeHidden()
+	 */
+	public void aboutToBeHidden() {
+		/* empty default implementation */
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#dispose()
+	 */
+	public void dispose() {
+		/* empty default implementation */
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#getMinimumHeight()
+	 */
+	public int getMinimumHeight() {
+		return SWT.DEFAULT;
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#shouldUseExtraSpace()
+	 */
+	public boolean shouldUseExtraSpace() {
+		return false;
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#refresh()
+	 */
+	public void refresh() {
+		/* empty default implementation */
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractSectionDescriptor.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractSectionDescriptor.java
new file mode 100644
index 0000000..54c34c5
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractSectionDescriptor.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.ui.views.properties.tabbed;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IFilter;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyRegistryClassSectionFilter;
+
+/**
+ * An abstract implementation of a section descriptor for the tabbed property
+ * view.
+ * 
+ * @author Anthony Hunter
+ * @since 3.4
+ */
+public abstract class AbstractSectionDescriptor implements ISectionDescriptor {
+
+	private TabbedPropertyRegistryClassSectionFilter classFilter;
+
+	/**
+	 * Constructor for AbstractSectionDescriptor.
+	 */
+	public AbstractSectionDescriptor() {
+		super();
+		classFilter = new TabbedPropertyRegistryClassSectionFilter(null);
+	}
+
+	/**
+	 * Constructor for AbstractSectionDescriptor.
+	 * 
+	 * @param typeMapper
+	 *            the type mapper for the section.
+	 */
+	public AbstractSectionDescriptor(ITypeMapper typeMapper) {
+		super();
+		classFilter = new TabbedPropertyRegistryClassSectionFilter(typeMapper);
+	}
+
+	/*
+	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
+		return classFilter.appliesToSelection(this, selection);
+	}
+
+	/*
+	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getAfterSection()
+	 */
+	public String getAfterSection() {
+		return TOP;
+	}
+
+	/*
+	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getEnablesFor()
+	 */
+	public int getEnablesFor() {
+		return ENABLES_FOR_ANY;
+	}
+
+	/*
+	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getFilter()
+	 */
+	public IFilter getFilter() {
+		return null;
+	}
+
+	public List getInputTypes() {
+		return new ArrayList();
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTabDescriptor.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTabDescriptor.java
new file mode 100644
index 0000000..124733f
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTabDescriptor.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.ui.views.properties.tabbed;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewPlugin;
+
+/**
+ * An abstract implementation of a tab descriptor for the tabbed property view.
+ * 
+ * @author Anthony Hunter
+ * @since 3.4
+ */
+public abstract class AbstractTabDescriptor implements ITabDescriptor,
+		Cloneable {
+
+	private List sectionDescriptors;
+
+	/**
+	 * Constructor for AbstractTabDescriptor.
+	 */
+	public AbstractTabDescriptor() {
+		super();
+		sectionDescriptors = new ArrayList(5);
+	}
+
+	/*
+	 * @see java.lang.Object#clone()
+	 */
+	public Object clone() {
+		try {
+			return super.clone();
+		} catch (CloneNotSupportedException exception) {
+			IStatus status = new Status(IStatus.ERROR, TabbedPropertyViewPlugin
+					.getPlugin().getBundle().getSymbolicName(), 666, exception
+					.getMessage(), exception);
+			TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
+		}
+		return null;
+	}
+
+	/*
+	 * @see org.eclipse.ui.views.properties.tabbed.ITabDescriptor#createTab()
+	 */
+	public TabContents createTab() {
+		List sections = new ArrayList(getSectionDescriptors().size());
+		for (Iterator iter = getSectionDescriptors().iterator(); iter.hasNext();) {
+			ISectionDescriptor descriptor = (ISectionDescriptor) iter.next();
+			ISection section = descriptor.getSectionClass();
+			sections.add(section);
+		}
+		TabContents tab = new TabContents();
+		tab.setSections((ISection[]) sections.toArray(new ISection[sections
+				.size()]));
+		return tab;
+	}
+
+	/*
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object object) {
+		if (this == object) {
+			return true;
+		}
+
+		if (this.getClass() == object.getClass()) {
+			AbstractTabDescriptor descriptor = (AbstractTabDescriptor) object;
+			if (this.getCategory().equals(descriptor.getCategory()) &&
+					this.getId().equals(descriptor.getId()) &&
+					this.getSectionDescriptors().size() == descriptor
+							.getSectionDescriptors().size()) {
+
+				Iterator i = this.getSectionDescriptors().iterator();
+				Iterator j = descriptor.getSectionDescriptors().iterator();
+
+				// the order is important here - so as long as the sizes of the
+				// lists are the same and id of the section at the same
+				// positions are the same - the lists are the same
+				while (i.hasNext()) {
+					ISectionDescriptor source = (ISectionDescriptor) i.next();
+					ISectionDescriptor target = (ISectionDescriptor) j.next();
+					if (!source.getId().equals(target.getId())) {
+						return false;
+					}
+				}
+
+				return true;
+			}
+
+		}
+
+		return false;
+	}
+
+	/*
+	 * @see org.eclipse.ui.views.properties.tabbed.ITabDescriptor#getAfterTab()
+	 */
+	public String getAfterTab() {
+		return TOP;
+	}
+
+	/*
+	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#getImage()
+	 */
+	public Image getImage() {
+		return null;
+	}
+
+	/**
+	 * Get the list of section descriptors for the tab.
+	 * 
+	 * @return the list of section descriptors for the tab.
+	 */
+	public List getSectionDescriptors() {
+		return sectionDescriptors;
+	}
+
+	/*
+	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#getText()
+	 */
+	public String getText() {
+		return getLabel();
+	}
+
+	/*
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+
+		int hashCode = getCategory().hashCode();
+		hashCode ^= getId().hashCode();
+		Iterator i = this.getSectionDescriptors().iterator();
+		while (i.hasNext()) {
+			ISectionDescriptor section = (ISectionDescriptor) i.next();
+			hashCode ^= section.getId().hashCode();
+		}
+		return hashCode;
+	}
+
+	/*
+	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#isIndented()
+	 */
+	public boolean isIndented() {
+		return false;
+	}
+
+	/*
+	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#isSelected()
+	 */
+	public boolean isSelected() {
+		return false;
+	}
+
+	/**
+	 * Set the list of section descriptors for the tab.
+	 * 
+	 * @param sectionDescriptors
+	 *            the list of section descriptors for the tab.
+	 */
+	public void setSectionDescriptors(List sectionDescriptors) {
+		this.sectionDescriptors = sectionDescriptors;
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTypeMapper.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTypeMapper.java
new file mode 100644
index 0000000..a2503d8
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTypeMapper.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+/**
+ * Default implementation of a type mapper.
+ * 
+ * @author Anthony Hunter
+ */
+public class AbstractTypeMapper
+    implements ITypeMapper {
+
+    public Class mapType(Object object) {
+        return object.getClass();
+    }
+
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AdvancedPropertySection.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AdvancedPropertySection.java
new file mode 100644
index 0000000..ffc9acf
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AdvancedPropertySection.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+
+/**
+ * An advanced section that is intended to show the original table format properties view
+ * provided by base Eclipse.
+ * 
+ * @author Anthony Hunter 
+ */
+public class AdvancedPropertySection
+	extends AbstractPropertySection {
+
+	/**
+	 * The Property Sheet Page.
+	 */
+	protected PropertySheetPage page;
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#createControls(org.eclipse.swt.widgets.Composite,
+	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
+	 */
+	public void createControls(Composite parent,
+			final TabbedPropertySheetPage atabbedPropertySheetPage) {
+		super.createControls(parent, atabbedPropertySheetPage);
+		Composite composite = getWidgetFactory()
+			.createFlatFormComposite(parent);
+		page = new PropertySheetPage();
+
+		page.createControl(composite);
+		FormData data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(100, 0);
+		data.top = new FormAttachment(0, 0);
+		data.bottom = new FormAttachment(100, 0);
+		page.getControl().setLayoutData(data);
+		
+		page.getControl().addControlListener(new ControlAdapter() {
+
+			public void controlResized(ControlEvent e) {
+				atabbedPropertySheetPage.resizeScrolledComposite();
+			}
+		});
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public void setInput(IWorkbenchPart part, ISelection selection) {
+		super.setInput(part, selection);
+		page.selectionChanged(part, selection);
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+
+		if (page != null) {
+			page.dispose();
+			page = null;
+		}
+
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#refresh()
+	 */
+	public void refresh() {
+		page.refresh();
+	}
+
+	/**
+	 * @see org.eclipse.ui.views.properties.tabbed.ISection#shouldUseExtraSpace()
+	 */
+	public boolean shouldUseExtraSpace() {
+		return true;
+	}
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IActionProvider.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IActionProvider.java
new file mode 100644
index 0000000..f44d417
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IActionProvider.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.ui.views.properties.tabbed;
+
+import org.eclipse.ui.IActionBars;
+
+/**
+ * Allows a tabbed properties view to make contributions to action bars.
+ * <p>
+ * An action provider is called when the tabbed properties view becomes the
+ * active view. It is at this point where the action provider can override the
+ * action bars.
+ * </p>
+ * <p>
+ * Normally {@link TabbedPropertySheetPage#setActionBars(IActionBars)} is
+ * sufficient, but this is only called once and is not sufficient for a
+ * contributor that is selection based. An example is the Project Explorer where
+ * different providers contribute different action sets and properties
+ * configurations.
+ * </p>
+ * <p>
+ * The most frequent use of setActionBars() is to retarget the global actions
+ * for undo and redo based on the active tabbed properties view contributor.
+ * </p>
+ * 
+ * @author Anthony Hunter
+ * @since 3.2.1
+ */
+public interface IActionProvider {
+
+    /**
+     * Allows the page to make contributions to the given action bars. The
+     * contributions will be visible when the page is visible.
+     * 
+     * @param contributor
+     *            the tabbed property sheet page contributor.
+     * @param actionBars
+     *            the action bars for this page
+     */
+    public void setActionBars(ITabbedPropertySheetPageContributor contributor,
+            IActionBars actionBars);
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabList.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabList.java
new file mode 100644
index 0000000..8ba2c7e
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabList.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+/**
+ * Represents a list of tabs. Used by a section that overrides the tabs that are
+ * provided by the tabbed property registry with a new list of tabs.
+ * <p>
+ * The overridable tab list is a content provider that provides both the
+ * sections and the tab labels.
+ * 
+ * @author Anthony Hunter
+ * @since 3.4
+ */
+public interface IOverridableTabList {
+
+	/**
+	 * Returns the list of tabs.
+	 * 
+	 * @return the list of tabs.
+	 */
+	public ITabItem[] getTabs();
+
+	/**
+	 * Select the tab at the provided index.
+	 * 
+	 * @param index
+	 *            the index in the list of tabs to select.
+	 */
+	public void selectTab(int index);
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabListContentProvider.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabListContentProvider.java
new file mode 100644
index 0000000..76991cd
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabListContentProvider.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+
+/**
+ * A content provider for the tabbed property sheet page's list of tabs. Used by
+ * a section that overrides the tabs that are provided by the tabbed property
+ * registry with a new list of tabs.
+ * <p>
+ * The overridable tab list is a content provider that provides both the
+ * sections and the tab labels.
+
+ * @author Anthony Hunter
+ * @since 3.4
+ */
+public interface IOverridableTabListContentProvider extends IStructuredContentProvider {
+
+	/**
+	 * Override the tabs displayed in the tab list with a new list of tabs.
+	 */
+	public void overrideTabs();
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISection.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISection.java
new file mode 100644
index 0000000..ddc6388
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISection.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Represents a section of properties for a given input.
+ * <p>
+ * The lifecycle of an ISection is as follows:
+ * <ul>
+ * <li><code>ISection.createControls()</code></li>
+ * <li><code>ISection.setInput()</code></li>
+ * <li><code>ISection.aboutToBeShown()</code></li>
+ * <li><code>ISection.refresh()</code></li>
+ * <li><code>ISection.aboutToBeHidden()</code></li>
+ * <li><code>ISection.dispose()</code></li>
+ * </ul>
+ * </p>
+ * <p>
+ * Implementors of this class should be aware that a section instance might be
+ * reused for different input objects (as long as they are valid section
+ * inputs). It means that <code>ISection.setInput</code> can be called at any
+ * time between <code>ISection.createControls</code> and
+ * <code>ISection.dispose</code>.
+ * </p>
+ * <p>
+ * When an input change event occurs, such as a tab selection or a workbench
+ * selection change, an ISection is sent:
+ * <ul>
+ * <li><code>ISection.setInput()</code></li>
+ * <li><code>ISection.refresh()</code></li>
+ * </ul>
+ * </p>
+ * <p>
+ * When an part activation event occurs, such as the contributor part activation
+ * event, an ISection is sent:
+ * <ul>
+ * <li><code>ISection.setInput()</code></li>
+ * <li><code>ISection.aboutToBeShown()</code></li>
+ * <li><code>ISection.refresh()</code></li>
+ * <li><code>ISection.setInput()</code></li>
+ * <li><code>ISection.refresh()</code></li>
+ * </ul>
+ * This is because both a tab selection event and an input selection event have
+ * occurred.
+ * </p>
+ * <p>
+ * This interface should not be extended or implemented. New section instances
+ * should be created using <code>AbstractPropertySection</code>.
+ * </p>
+ * @see org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage
+ * 
+ * @author Anthony Hunter
+ */
+public interface ISection {
+
+	/**
+	 * Creates the controls for the section.
+	 * <p>
+	 * Clients should take advantage of the widget factory provided by the
+	 * framework to achieve a common look between property sections.
+	 * </p>
+	 * @see org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage#getWidgetFactory()
+	 * 
+	 * @param parent
+	 *            the parent composite for the section.
+	 * @param tabbedPropertySheetPage
+	 *            the tabbed property sheet page.
+	 */
+	public abstract void createControls(Composite parent,
+			TabbedPropertySheetPage tabbedPropertySheetPage);
+
+	/**
+	 * Notifies the section that the workbench selection has changed. 
+	 * @param part The active workench part.
+	 * @param selection The active selection in the workbench part.
+	 */
+	public abstract void setInput(IWorkbenchPart part, ISelection selection);
+
+	/**
+	 * Notifies the section that its controls are about to be shown. It is
+	 * expected that sections enable domain related functions in this method,
+	 * most commonly add listeners.
+	 * <p>
+	 * Since the controls are not visible, the section should wait for the
+	 * refresh() before updating the section controls.
+	 * </p>
+	 */
+	public abstract void aboutToBeShown();
+
+	/**
+	 * Notifies the section that its controls are about to be hidden. It is
+	 * expected that sections disable domain related functions in this method,
+	 * most commonly remove listeners.
+	 */
+	public abstract void aboutToBeHidden();
+
+	/**
+	 * Dispose this section.
+	 */
+	public abstract void dispose();
+
+	/**
+	 * Returns the minimum height needed by this section. A return value of
+	 * <code>SWT.DEFAULT</code> indicates that no minimum height is defined.
+	 * 
+	 * @return the minimum height needed by this section.
+	 */
+	public abstract int getMinimumHeight();
+
+	/**
+	 * Determine whether this section would like extra height space in case
+	 * there is some left. Normally this is true when the section is the last to
+	 * be displayed on a tab or is the only section on a tab.
+	 * @return <code>true</code> if this section would like extra height space.
+	 */
+	public abstract boolean shouldUseExtraSpace();
+
+	/**
+	 * Refresh the contents of the controls displayed in this section.
+	 */
+	public abstract void refresh();
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptor.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptor.java
new file mode 100644
index 0000000..ad1ed18
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptor.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.IFilter;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Represents a section descriptor on the tabbed property sections extensions.
+ * <p>
+ * This interface should not be extended or implemented. New instances should be
+ * created using <code>AbstractSectionDescriptor</code>.
+ * </p>
+ * 
+ * @author Anthony Hunter
+ */
+public interface ISectionDescriptor {
+
+	/**
+	 * If enabledFor is not specified in the descriptor, enable for any
+	 * selection.
+	 */
+	public final int ENABLES_FOR_ANY = -1;
+
+	/**
+	 * If afterSection is not specified in the descriptor, we default to be the
+	 * top section.
+	 * @since 3.4
+	 */
+	public static final String TOP = "top"; //$NON-NLS-1$
+
+	/**
+	 * Get the unique identifier for the section.
+	 * 
+	 * @return the unique identifier for the section.
+	 */
+	public String getId();
+
+	/**
+	 * Get the section filter instance for this section. Return null if no
+	 * filter for this section.
+	 * 
+	 * @return the section filter instance.
+	 */
+	public IFilter getFilter();
+
+	/**
+	 * Get the valid input types for this section.
+	 * 
+	 * @return the valid input types for this section.
+	 */
+	public List getInputTypes();
+
+	/**
+	 * Get the class that implements this section.
+	 * 
+	 * @return the class that implements this section.
+	 */
+	public ISection getSectionClass();
+
+	/**
+	 * Get the target tab where this section will appear.
+	 * 
+	 * @return the target tab where this section will appear.
+	 */
+	public String getTargetTab();
+
+	/**
+	 * Get the value for section enablement which is a precise number of items
+	 * selected. For example: enablesFor="1" enables the section only when one
+	 * item is selected. If not specified, enable for any selection and return
+	 * ENABLES_FOR_ANY.
+	 * 
+	 * @return the value for section enablement.
+	 */
+	public int getEnablesFor();
+
+	/**
+	 * Determines if this section applies to the selection.
+	 * 
+	 * @param part
+	 *            the current workbench part.
+	 * @param selection
+	 *            the selection.
+	 * @return <code>true</code> if this section applies to the current
+	 *         selection.
+	 */
+	public boolean appliesTo(IWorkbenchPart part, ISelection selection);
+
+	/**
+	 * Get the section identifier below which this section is displayed.
+	 * <code>"top"</code> is returned if this section is the top most section
+	 * or if there is one section in the tab.
+	 * 
+	 * @return the section identifier.
+	 */
+	public String getAfterSection();
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptorProvider.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptorProvider.java
new file mode 100644
index 0000000..e47aeb4
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptorProvider.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+/**
+ * Represents a section descriptor provider for tabbed property sections.
+ * 
+ * @author Anthony Hunter
+ */
+public interface ISectionDescriptorProvider {
+
+	/**
+	 * Returns all section descriptors for the contributor.
+	 * @return all section descriptors.
+	 */
+	public ISectionDescriptor[] getSectionDescriptors();
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptor.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptor.java
new file mode 100644
index 0000000..2680e3f
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptor.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.ui.views.properties.tabbed;
+
+import java.util.List;
+
+/**
+ * Represents a tab descriptor for the tabbed property view.
+ * <p>
+ * This interface should not be extended or implemented. New instances should be
+ * created using <code>AbstractTabDescriptor</code>.
+ * </p>
+ * 
+ * @author Anthony Hunter
+ * @since 3.4
+ */
+public interface ITabDescriptor extends ITabItem {
+
+	/**
+	 * If afterTab is not specified in the descriptor, we default to be the top
+	 * tab.
+	 */
+	public static final String TOP = "top"; //$NON-NLS-1$
+
+	/**
+	 * Instantiate this tab's sections.
+	 * 
+	 * @return The tab contents for this section.
+	 */
+	public TabContents createTab();
+
+	/**
+	 * Get the identifier of the tab after which this tab should be displayed.
+	 * When two or more tabs belong to the same category, they are sorted by the
+	 * after tab values.
+	 * 
+	 * @return the identifier of the tab.
+	 */
+	public String getAfterTab();
+
+	/**
+	 * Get the category this tab belongs to.
+	 * 
+	 * @return Get the category this tab belongs to.
+	 */
+	public String getCategory();
+
+	/**
+	 * Get the unique identifier for the tab.
+	 * 
+	 * @return the unique identifier for the tab.
+	 */
+	public String getId();
+
+	/**
+	 * Get the text label for the tab.
+	 * 
+	 * @return the text label for the tab.
+	 */
+	public String getLabel();
+
+	/**
+	 * Get the list of section descriptors for the tab.
+	 * 
+	 * @return the list of section descriptors for the tab.
+	 */
+	public List getSectionDescriptors();
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptorProvider.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptorProvider.java
new file mode 100644
index 0000000..3583d4e
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptorProvider.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Represents a tab descriptor provider for the tabbed property view.
+ * 
+ * @author Anthony Hunter
+ * @since 3.4
+ */
+public interface ITabDescriptorProvider {
+
+	/**
+	 * Returns all tab descriptors.
+	 * 
+	 * @param part
+	 *            the workbench part containing the selection
+	 * @param selection
+	 *            the current selection.
+	 * @return all section descriptors.
+	 */
+	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part,
+			ISelection selection);
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabItem.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabItem.java
new file mode 100644
index 0000000..9cd387c
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabItem.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Represents a tab to be displayed in the tab list in the tabbed property sheet
+ * page.
+ * 
+ * @author Anthony Hunter 
+ */
+public interface ITabItem {
+
+	/**
+	 * Get the icon image for the tab.
+	 * 
+	 * @return the icon image for the tab.
+	 */
+	public Image getImage();
+
+	/**
+	 * Get the text label for the tab.
+	 * 
+	 * @return the text label for the tab.
+	 */
+	public String getText();
+
+	/**
+	 * Determine if this tab is selected.
+	 * 
+	 * @return <code>true</code> if this tab is selected.
+	 */
+	public boolean isSelected();
+
+	/**
+	 * Determine if this tab is indented.
+	 * 
+	 * @return <code>true</code> if this tab is indented.
+	 */
+	public boolean isIndented();
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabSelectionListener.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabSelectionListener.java
new file mode 100644
index 0000000..ac662c7
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabSelectionListener.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+/**
+ * A listener interested in tab selection events that occur for the tabbed
+ * property sheet page.
+ * 
+ * @author Anthony Hunter 
+ */
+public interface ITabSelectionListener {
+
+	/**
+	 * Notifies this listener that the selected tab has changed.
+	 * 
+	 * @param tabDescriptor
+	 *            the selected tab descriptor.
+	 * @since 3.4
+	 */
+	public void tabSelected(ITabDescriptor tabDescriptor);
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertyConstants.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertyConstants.java
new file mode 100644
index 0000000..8b9395c
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertyConstants.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+/**
+ * Constants used by the implementors of ITabbedPropertySection.
+ * 
+ * @author Anthony Hunter 
+ */
+public interface ITabbedPropertyConstants {
+
+	/**
+	 * These horizontal margin around the composite.
+	 * Each section should use a margin of 0, 0.
+	 */
+	public static final int HMARGIN = 6;
+	
+	/**
+	 * These horizontal margin around the composite.
+	 */
+	public static final int VMARGIN = 6;
+
+	/**
+	 * Horizontal space to leave between related widgets. 
+	 * Each section should use these values for spacing its widgets. 
+	 * For example, you can use +/- HSPACE as the offset of a left or 
+	 * right FlatFormAttachment.
+	 * 
+	 * The tabbed property composite also inserts VSPACE pixels between 
+	 * section composites if more than one section is displayed.  
+	 */
+	public static final int HSPACE = 5;
+	
+	/**
+	 * Horizontal space to leave between related widgets.
+	 */ 
+	public static final int VSPACE = 4;
+
+	/**
+	 * Space to leave between the center of the property tab and the closest
+	 * widget to the left or right. I.e. for a property tab whose widgets are
+	 * logically divided into two halves, the total space between the halves
+	 * should be 2*CENTER_SPACE.
+	 */
+	public static final int CENTER_SPACE = 10;
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertySheetPageContributor.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertySheetPageContributor.java
new file mode 100644
index 0000000..3b5b009
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertySheetPageContributor.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+/**
+ * Interface for a workbench part to contribute content to the tabbed property
+ * view.
+ * <p>
+ * It is expected that the contributor ID is unique for a configuration of tabs
+ * and sections. Editors and views can share a configuration by sharing a
+ * contributor ID. Editors and views cannot share tabs and sections from
+ * multiple contributors.
+ * </p>
+ * <p>
+ * As a workaround, if all the elements in a structured selection implement
+ * ITabbedPropertySheetPageContributor and they all return the same unique
+ * contributor ID, then that configuration of tabs and sections will be used by
+ * the tabbed property view for that selection.
+ * </p>
+ * 
+ * @author Anthony Hunter
+ */
+public interface ITabbedPropertySheetPageContributor {
+
+	/**
+	 * Returns the contributor ID for the tabbed property sheet page.
+	 * 
+	 * @return the contributor ID for the tabbed property sheet page.
+	 */
+	public String getContributorId();
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITypeMapper.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITypeMapper.java
new file mode 100644
index 0000000..66939d8
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITypeMapper.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * 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
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+/**
+ * Allows property sheet page contributors to map the input object type to a
+ * domain model type. The domain model type is then used for matching against
+ * the input attribute of the propertySection extension.
+ * <p>
+ * The type mapper is most frequently used to return the type of the model
+ * object when selecting a view object in a workbench part. For example, nodes
+ * in a tree may all be TreeObjects in a structured selection. The type mapper
+ * will take the tree node and return the type of the model object the node
+ * represents.
+ * </p>
+ * <p>
+ * This interface should not be extended or implemented. New type mapper instances
+ * should be created using <code>AbstractTypeMapper</code>.
+ * </p>
+ * 
+ * @author Anthony Hunter
+ */
+public interface ITypeMapper {
+
+	/**
+	 * Map the input object to a domain model type.
+	 * 
+	 * @param object
+	 *            the input object.
+	 * @return the type of the input object, mapped to the domain type if
+	 *         required.
+	 */
+	public Class mapType(Object object);
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabContents.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabContents.java
new file mode 100644
index 0000000..ec95fde
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabContents.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * A property tab is composed by one or more property sections and is used to
+ * categorize sections.
+ * 
+ * @author Anthony Hunter
+ * @since 3.4
+ */
+public final class TabContents {
+
+    private ISection[] sections;
+
+    private boolean controlsCreated;
+
+    /**
+     * 
+     */
+    public TabContents() {
+        controlsCreated = false;
+    }
+
+    /**
+     * Retrieve a numbered index for the section.
+     * @param section the section.
+     * @return the section index.
+     */
+    public int getSectionIndex(ISection section) {
+        for (int i = 0; i < sections.length; i++) {
+			if (section == sections[i]) {
+				return i;
+			}
+		}
+        return -1;
+    }
+
+    /**
+     * Retrieve the section at a numbered index.
+     * @param i a numbered index.
+     * @return the section.
+     */
+    public ISection getSectionAtIndex(int i) {
+        if (i >= 0 && i < sections.length) {
+			return sections[i];
+		}
+        return null;
+    }
+
+    /**
+     * Retrieve the sections on the tab.
+     * 
+     * @return the sections on the tab.
+     */
+    public ISection[] getSections() {
+        return sections;
+    }
+
+    /**
+     * Creates page's sections controls.
+     * 
+     * @param parent
+     * @param page
+     */
+    public void createControls(Composite parent,
+            final TabbedPropertySheetPage page) {
+        Composite pageComposite = page.getWidgetFactory().createComposite(
+            parent, SWT.NO_FOCUS);
+        GridLayout layout = new GridLayout();
+        layout.marginWidth = 0;
+        layout.marginHeight = 0;
+        layout.verticalSpacing = 0;
+        pageComposite.setLayout(layout);
+
+        for (int i = 0; i < sections.length; i++) {
+            final ISection section = sections[i];
+            final Composite sectionComposite = page.getWidgetFactory()
+                .createComposite(pageComposite, SWT.NO_FOCUS);
+            sectionComposite.setLayout(new FillLayout());
+            int style = (section.shouldUseExtraSpace()) ? GridData.FILL_BOTH
+                : GridData.FILL_HORIZONTAL;
+            GridData data = new GridData(style);
+            data.heightHint = section.getMinimumHeight();
+            sectionComposite.setLayoutData(data);
+
+            ISafeRunnable runnable = new SafeRunnable() {
+
+                public void run()
+                    throws Exception {
+                    section.createControls(sectionComposite, page);
+                }
+            };
+            SafeRunnable.run(runnable);
+        }
+        controlsCreated = true;
+    }
+
+    /**
+     * Dispose of page's sections controls.
+     */
+    public void dispose() {
+        for (int i = 0; i < sections.length; i++) {
+            final ISection section = sections[i];
+            ISafeRunnable runnable = new SafeRunnable() {
+
+                public void run()
+                    throws Exception {
+                    section.dispose();
+                }
+            };
+            SafeRunnable.run(runnable);
+        }
+    }
+
+    /**
+     * Sends the lifecycle event to the page's sections.
+     */
+    public void aboutToBeShown() {
+        for (int i = 0; i < sections.length; i++) {
+            final ISection section = sections[i];
+            ISafeRunnable runnable = new SafeRunnable() {
+
+                public void run()
+                    throws Exception {
+                    section.aboutToBeShown();
+                }
+            };
+            SafeRunnable.run(runnable);
+        }
+    }
+
+    /**
+     * Sends the lifecycle event to the page's sections.
+     */
+    public void aboutToBeHidden() {
+        for (int i = 0; i < sections.length; i++) {
+            final ISection section = sections[i];
+            ISafeRunnable runnable = new SafeRunnable() {
+
+                public void run()
+                    throws Exception {
+                    section.aboutToBeHidden();
+                }
+            };
+            SafeRunnable.run(runnable);
+        }
+    }
+
+    /**
+     * Sets page's sections input objects.
+     * 
+     * @param part
+     * @param selection
+     */
+    public void setInput(final IWorkbenchPart part, final ISelection selection) {
+        for (int i = 0; i < sections.length; i++) {
+            final ISection section = sections[i];
+            ISafeRunnable runnable = new SafeRunnable() {
+
+                public void run()
+                    throws Exception {
+                    section.setInput(part, selection);
+                }
+            };
+            SafeRunnable.run(runnable);
+        }
+    }
+
+    /**
+     * Set the sections for the tab.
+     * 
+     * @param sections the sections for the tab.
+     */
+    public void setSections(ISection[] sections) {
+        this.sections = sections;
+    }
+
+    /**
+     * Determine if the controls have been created.
+     * 
+     * @return <code>true</code> if controls have been created.
+     */
+    public boolean controlsHaveBeenCreated() {
+        return controlsCreated;
+    }
+
+    /**
+     * If controls have been created, refresh all sections on the page.
+     */
+    public void refresh() {
+        if (controlsCreated) {
+            for (int i = 0; i < sections.length; i++) {
+                final ISection section = sections[i];
+                ISafeRunnable runnable = new SafeRunnable() {
+
+                    public void run()
+                        throws Exception {
+                        section.refresh();
+                    }
+                };
+                SafeRunnable.run(runnable);
+            }
+        }
+    }
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetPage.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetPage.java
new file mode 100644
index 0000000..492decf
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetPage.java
@@ -0,0 +1,1053 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.LabelProviderChangedEvent;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyComposite;
+import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyRegistry;
+import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyRegistryFactory;
+import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyTitle;
+import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyViewer;
+import org.eclipse.ui.part.IContributedContentsView;
+import org.eclipse.ui.part.Page;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.PropertySheet;
+
+/**
+ * A property sheet page that provides a tabbed UI.
+ *
+ * @author Anthony Hunter
+ */
+public class TabbedPropertySheetPage
+	extends Page
+	implements IPropertySheetPage, ILabelProviderListener {
+
+	// widgets
+	private TabbedPropertyComposite tabbedPropertyComposite;
+
+	private TabbedPropertySheetWidgetFactory widgetFactory;
+
+	private ITabbedPropertySheetPageContributor contributor;
+
+	private TabbedPropertyRegistry registry;
+
+	private ITabbedPropertySheetPageContributor selectionContributor = null;
+
+	/**
+	 * The currently active contributor id, which may not match the contributor
+	 * id from the workbench part that created this instance.
+	 */
+	private String currentContributorId;
+
+	protected IStructuredContentProvider tabListContentProvider;
+
+	private ISelection currentSelection;
+
+	private boolean activePropertySheet;
+
+	private TabbedPropertyViewer tabbedPropertyViewer;
+
+	private TabContents currentTab;
+
+	private Map descriptorToTab;
+
+	private Map tabToComposite;
+
+	private List selectionQueue;
+
+	private boolean selectionQueueLocked;
+
+	private List tabSelectionListeners;
+
+	private IWorkbenchWindow cachedWorkbenchWindow;
+
+	private boolean hasTitleBar;
+
+	/**
+	 * a listener that is interested in part activation events.
+	 */
+	private IPartListener partActivationListener = new IPartListener() {
+
+		public void partActivated(IWorkbenchPart part) {
+			handlePartActivated(part);
+		}
+
+		public void partBroughtToTop(IWorkbenchPart part) {
+		}
+
+		public void partClosed(IWorkbenchPart part) {
+		}
+
+		public void partDeactivated(IWorkbenchPart part) {
+		}
+
+		public void partOpened(IWorkbenchPart part) {
+		}
+	};
+
+	private class TabbedPropertySheetPageContributorFromSelection
+		implements ITabbedPropertySheetPageContributor {
+
+		private String contributorId;
+
+		/**
+		 * Constructor that takes in a contributor id taken from a selection.
+		 *
+		 * @param contributorId
+		 *            the contributor id.
+		 */
+		public TabbedPropertySheetPageContributorFromSelection(
+				String contributorId) {
+			super();
+			this.contributorId = contributorId;
+		}
+
+		/**
+		 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor#getContributorId()
+		 */
+		public String getContributorId() {
+			return contributorId;
+		}
+
+	}
+
+	/**
+	 * Label provider for the ListViewer.
+	 */
+	class TabbedPropertySheetPageLabelProvider
+		extends LabelProvider {
+
+		public String getText(Object element) {
+			if (element instanceof ITabDescriptor) {
+				return ((ITabDescriptor) element).getLabel();
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * SelectionChangedListener for the ListViewer.
+	 */
+	class SelectionChangedListener
+		implements ISelectionChangedListener {
+
+		/**
+		 * Shows the tab associated with the selection.
+		 */
+		public void selectionChanged(SelectionChangedEvent event) {
+			IStructuredSelection selection = (IStructuredSelection) event
+				.getSelection();
+			TabContents tab = null;
+			ITabDescriptor descriptor = (ITabDescriptor) selection
+					.getFirstElement();
+
+			if (descriptor == null) {
+				// pretend the tab is empty.
+				hideTab(currentTab);
+			} else {
+				// create tab if necessary
+				// can not cache based on the id - tabs may have the same id,
+				// but different section depending on the selection
+				tab = (TabContents) descriptorToTab.get(descriptor);
+
+				if (tab != currentTab) {
+					hideTab(currentTab);
+				}
+
+				Composite tabComposite = (Composite) tabToComposite.get(tab);
+				if (tabComposite == null) {
+					tabComposite = createTabComposite();
+					tab.createControls(tabComposite,
+						TabbedPropertySheetPage.this);
+					// tabAreaComposite.layout(true);
+					tabToComposite.put(tab, tabComposite);
+				}
+				// force widgets to be resized
+				tab.setInput(tabbedPropertyViewer.getWorkbenchPart(),
+					(ISelection) tabbedPropertyViewer.getInput());
+
+				// store tab selection
+				storeCurrentTabSelection(descriptor.getLabel());
+
+				if (tab != currentTab) {
+					showTab(tab);
+				}
+
+				tab.refresh();
+			}
+			tabbedPropertyComposite.getTabComposite().layout(true);
+			currentTab = tab;
+			resizeScrolledComposite();
+
+			if (descriptor != null) {
+				handleTabSelection(descriptor);
+			}
+		}
+
+		/**
+		 * Shows the given tab.
+		 */
+		private void showTab(TabContents target) {
+			if (target != null) {
+				Composite tabComposite = (Composite) tabToComposite.get(target);
+				if (tabComposite != null) {
+					/**
+					 * the following method call order is important - do not
+					 * change it or the widgets might be drawn incorrectly
+					 */
+					tabComposite.moveAbove(null);
+					target.aboutToBeShown();
+					tabComposite.setVisible(true);
+				}
+			}
+		}
+
+		/**
+		 * Hides the given tab.
+		 */
+		private void hideTab(TabContents target) {
+			if (target != null) {
+				Composite tabComposite = (Composite) tabToComposite.get(target);
+				if (tabComposite != null) {
+					target.aboutToBeHidden();
+					tabComposite.setVisible(false);
+				}
+			}
+		}
+
+	}
+
+	/**
+	 * create a new tabbed property sheet page.
+	 *
+	 * @param tabbedPropertySheetPageContributor
+	 *            the tabbed property sheet page contributor.
+	 */
+	public TabbedPropertySheetPage(
+			ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor) {
+		this(tabbedPropertySheetPageContributor, true);
+	}
+
+	/**
+	 * create a new tabbed property sheet page.
+	 *
+	 * @param tabbedPropertySheetPageContributor
+	 *            the tabbed property sheet page contributor.
+	 * @param showTitleBar
+	 *            boolean indicating if the title bar should be shown;
+	 *            default value is <code>true</code>
+	 * @since 3.5
+	 */
+	public TabbedPropertySheetPage(
+			ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor,
+			boolean showTitleBar) {
+		hasTitleBar = showTitleBar;
+		contributor = tabbedPropertySheetPageContributor;
+		tabToComposite = new HashMap();
+		selectionQueue = new ArrayList(10);
+		tabSelectionListeners = new ArrayList();
+		initContributor(contributor.getContributorId());
+	}
+
+	/**
+	 * Handle the part activated event.
+	 *
+	 * @param part
+	 *            the new activated part.
+	 */
+	protected void handlePartActivated(IWorkbenchPart part) {
+		/*
+		 * The properties view has been activated and the current page is this
+		 * instance of TabbedPropertySheetPage
+		 */
+		boolean thisActivated = part instanceof PropertySheet
+			&& ((PropertySheet) part).getCurrentPage() == this;
+
+		/*
+		 * When the active part changes and the part does not provide a
+		 * selection that affects this property sheet page, the PropertySheet
+		 * does not send us a selectionChanged() event. We need to be informed
+		 * of these events since we want to send aboutToBeHidden() and
+		 * aboutToBeShown() when the property sheet is hidden or shown.
+		 */
+        if (!thisActivated && !part.equals(contributor)
+                && !part.getSite().getId().equals(contributor.getContributorId())) {
+			/*
+			 * Is the part is a IContributedContentsView for the contributor,
+			 * for example, outline view.
+			 */
+			IContributedContentsView view = (IContributedContentsView) part
+				.getAdapter(IContributedContentsView.class);
+			if (view == null
+				|| (view.getContributingPart() != null && !view
+					.getContributingPart().equals(contributor))) {
+				if (activePropertySheet) {
+					if (currentTab != null) {
+						currentTab.aboutToBeHidden();
+					}
+					activePropertySheet = false;
+				}
+				return;
+			}
+		}
+		if (!activePropertySheet && currentTab != null) {
+			currentTab.aboutToBeShown();
+			currentTab.refresh();
+		}
+		activePropertySheet = true;
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createControl(Composite parent) {
+		widgetFactory = new TabbedPropertySheetWidgetFactory();
+		tabbedPropertyComposite = new TabbedPropertyComposite(parent,
+			widgetFactory, hasTitleBar);
+//		widgetFactory.paintBordersFor(tabbedPropertyComposite);
+		tabbedPropertyComposite.setLayout(new FormLayout());
+		FormData formData = new FormData();
+		formData.left = new FormAttachment(0, 0);
+		formData.right = new FormAttachment(100, 0);
+		formData.top = new FormAttachment(0, 0);
+		formData.bottom = new FormAttachment(100, 0);
+		tabbedPropertyComposite.setLayoutData(formData);
+
+		tabbedPropertyViewer = new TabbedPropertyViewer(tabbedPropertyComposite
+			.getList());
+		tabbedPropertyViewer.setContentProvider(tabListContentProvider);
+		tabbedPropertyViewer
+			.setLabelProvider(new TabbedPropertySheetPageLabelProvider());
+		tabbedPropertyViewer
+			.addSelectionChangedListener(new SelectionChangedListener());
+
+		tabbedPropertyComposite.getScrolledComposite().addControlListener(
+				new ControlAdapter() {
+
+					public void controlResized(ControlEvent e) {
+						resizeScrolledComposite();
+					}
+				});
+
+		/**
+		 * Add a part activation listener.
+		 */
+		cachedWorkbenchWindow = getSite().getWorkbenchWindow();
+		cachedWorkbenchWindow.getPartService().addPartListener(
+				partActivationListener);
+
+		/**
+		 * Add a label provider change listener.
+		 */
+		if (hasTitleBar) {
+			registry.getLabelProvider().addListener(this);
+		}
+	}
+
+	/**
+	 * Initialize the contributor with the provided contributor id.
+	 *
+	 * @param contributorId
+	 *            the contributor id.
+	 */
+	private void initContributor(String contributorId) {
+		descriptorToTab = new HashMap();
+		if (contributor.getContributorId().equals(contributorId)) {
+			/**
+			 * default contributor from the workbench part.
+			 */
+			registry = TabbedPropertyRegistryFactory.getInstance()
+				.createRegistry(contributor);
+		} else {
+			/**
+			 * selection contributor.
+			 */
+			selectionContributor = new TabbedPropertySheetPageContributorFromSelection(
+				contributorId);
+			registry = TabbedPropertyRegistryFactory.getInstance()
+				.createRegistry(selectionContributor);
+		}
+		currentContributorId = contributorId;
+		tabListContentProvider = getTabListContentProvider();
+		hasTitleBar = hasTitleBar && registry.getLabelProvider() != null;
+
+		if (tabbedPropertyViewer != null) {
+			tabbedPropertyViewer.setContentProvider(tabListContentProvider);
+		}
+
+		/**
+		 * Add a label provider change listener.
+		 */
+		if (hasTitleBar) {
+			registry.getLabelProvider().addListener(this);
+		}
+
+	}
+
+	/**
+	 * Gets the tab list content provider for the contributor.
+	 *
+	 * @return the tab list content provider for the contributor.
+	 */
+	protected IStructuredContentProvider getTabListContentProvider() {
+		return registry.getTabListContentProvider();
+	}
+
+	/**
+	 * Dispose the contributor with the provided contributor id. This happens on
+	 * part close as well as when contributors switch between the workbench
+	 * part and contributor from a selection.
+	 */
+	private void disposeContributor() {
+		/**
+		 * If the current tab is about to be disposed we have to call
+		 * aboutToBeHidden
+		 */
+		if (currentTab != null) {
+			currentTab.aboutToBeHidden();
+			currentTab = null;
+		}
+
+		disposeTabs(descriptorToTab.values());
+		descriptorToTab = new HashMap();
+
+		/**
+		 * Remove the label provider change listener.
+		 */
+		if (hasTitleBar && registry != null) {
+			registry.getLabelProvider().removeListener(this);
+		}
+
+		if (selectionContributor != null) {
+			/**
+			 * remove the selection contributed registry.
+			 */
+			TabbedPropertyRegistryFactory.getInstance().disposeRegistry(
+				selectionContributor);
+			selectionContributor = null;
+		}
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.IPage#dispose()
+	 */
+	public void dispose() {
+
+		disposeContributor();
+
+		if (widgetFactory != null) {
+			widgetFactory.dispose();
+			widgetFactory = null;
+		}
+		/**
+		 * Remove the part activation listener.
+		 */
+		if (cachedWorkbenchWindow != null) {
+			cachedWorkbenchWindow.getPartService().removePartListener(
+				partActivationListener);
+			cachedWorkbenchWindow = null;
+		}
+
+		if (registry != null) {
+			TabbedPropertyRegistryFactory.getInstance().disposeRegistry(
+				contributor);
+			registry = null;
+		}
+
+        contributor = null;
+        currentSelection = null;
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.IPage#getControl()
+	 */
+	public Control getControl() {
+		return tabbedPropertyComposite;
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars)
+	 */
+	public void setActionBars(IActionBars actionBars) {
+		// Override the undo and redo global action handlers
+		// to use the contributor action handlers
+        IActionBars partActionBars = null;
+		if (contributor instanceof IEditorPart) {
+			IEditorPart editorPart = (IEditorPart) contributor;
+            partActionBars = editorPart.getEditorSite().getActionBars();
+		} else if (contributor instanceof IViewPart) {
+            IViewPart viewPart = (IViewPart) contributor;
+            partActionBars = viewPart.getViewSite().getActionBars();
+        }
+
+        if (partActionBars != null) {
+            IAction action = partActionBars.getGlobalActionHandler(ActionFactory.UNDO
+                .getId());
+            if (action != null) {
+                actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), action);
+            }
+            action = partActionBars.getGlobalActionHandler(ActionFactory.REDO
+                .getId());
+            if (action != null) {
+                actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), action);
+            }
+        }
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.IPage#setFocus()
+	 */
+	public void setFocus() {
+		getControl().setFocus();
+	}
+
+	/**
+	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+		setInput(part, selection);
+	}
+
+	/**
+	 * Stores the current tab label in the selection queue. Tab labels are used
+	 * to carry the tab context from one input object to another. The queue
+	 * specifies the selection priority. So if the first tab in the queue is not
+	 * available for the input we try the second tab and so on. If none of the
+	 * tabs are available we default to the first tab available for the input.
+	 */
+	private void storeCurrentTabSelection(String label) {
+		if (!selectionQueueLocked) {
+			selectionQueue.remove(label);
+			selectionQueue.add(0, label);
+		}
+	}
+
+	/**
+	 * Resize the scrolled composite enclosing the sections, which may result in the
+	 * addition or removal of scroll bars.
+	 *
+	 * @since 3.5
+	 */
+	public void resizeScrolledComposite() {
+		Point currentTabSize = new Point(0, 0);
+		if (currentTab != null) {
+			Composite sizeReference = (Composite) tabToComposite
+				.get(currentTab);
+			if (sizeReference != null) {
+				currentTabSize = sizeReference.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+			}
+		}
+		tabbedPropertyComposite.getScrolledComposite().setMinSize(
+				currentTabSize);
+
+//		ScrollBar verticalScrollBar = tabbedPropertyComposite
+//				.getScrolledComposite().getVerticalBar();
+//		if (verticalScrollBar != null) {
+//			Rectangle clientArea = tabbedPropertyComposite
+//					.getScrolledComposite().getClientArea();
+//			int increment = clientArea.height - 5;
+//			verticalScrollBar.setPageIncrement(increment);
+//		}
+
+//		ScrollBar horizontalScrollBar = tabbedPropertyComposite
+//				.getScrolledComposite().getHorizontalBar();
+//		if (horizontalScrollBar != null) {
+//			Rectangle clientArea = tabbedPropertyComposite
+//					.getScrolledComposite().getClientArea();
+//			int increment = clientArea.width - 5;
+//			horizontalScrollBar.setPageIncrement(increment);
+//		}
+	}
+
+	private void disposeTabs(Collection tabs) {
+		for (Iterator iter = tabs.iterator(); iter.hasNext();) {
+			TabContents tab = (TabContents) iter.next();
+			Composite composite = (Composite) tabToComposite.remove(tab);
+			tab.dispose();
+			if (composite != null) {
+				composite.dispose();
+			}
+		}
+	}
+
+	/**
+	 * Returns the last known selected tab for the given input.
+	 */
+	private int getLastTabSelection(IWorkbenchPart part, ISelection input) {
+		ITabDescriptor[] descriptors = registry.getTabDescriptors(part, input);
+		if (descriptors.length != 0) {
+			for (Iterator iter = selectionQueue.iterator(); iter.hasNext();) {
+				String text = (String) iter.next();
+				for (int i = 0; i < descriptors.length; i++) {
+					if (text.equals(descriptors[i].getLabel())) {
+						return i;
+					}
+				}
+			}
+		}
+		return 0;
+	}
+
+	/**
+	 * Update the current tabs to represent the given input object. When tabs
+	 * apply for both the old and new input they are reused otherwise they are
+	 * disposed. If the current visible tab will not be reused (i.e. will be
+	 * disposed) we have to send it an aboutToBeHidden() message.
+	 * @since 3.4
+	 */
+	protected void updateTabs(ITabDescriptor[] descriptors) {
+		Map newTabs = new HashMap(descriptors.length * 2);
+		boolean disposingCurrentTab = (currentTab != null);
+		for (int i = 0; i < descriptors.length; i++) {
+			TabContents tab = (TabContents) descriptorToTab
+					.remove(descriptors[i]);
+
+			if (tab != null && tab.controlsHaveBeenCreated()) {
+				if (tab == currentTab) {
+					disposingCurrentTab = false;
+				}
+			} else {
+				tab = createTab(descriptors[i]);
+			}
+
+			newTabs.put(descriptors[i], tab);
+		}
+		if (disposingCurrentTab) {
+			/**
+			 * If the current tab is about to be disposed we have to call
+			 * aboutToBeHidden
+			 */
+			currentTab.aboutToBeHidden();
+			currentTab = null;
+		}
+		disposeTabs(descriptorToTab.values());
+		descriptorToTab = newTabs;
+	}
+
+	/**
+	 * Create the tab contents for the provided tab descriptor.
+	 *
+	 * @param tabDescriptor
+	 *            the tab descriptor.
+	 * @return the tab contents.
+	 * @since 3.4
+	 */
+	protected TabContents createTab(ITabDescriptor tabDescriptor) {
+		return tabDescriptor.createTab();
+	}
+
+	/**
+	 * Helper method for creating property tab composites.
+	 *
+	 * @return the property tab composite.
+	 */
+	private Composite createTabComposite() {
+		Composite result = widgetFactory.createComposite(
+			tabbedPropertyComposite.getTabComposite(), SWT.NO_FOCUS);
+		result.setVisible(false);
+		result.setLayout(new FillLayout());
+		FormData data = new FormData();
+		if (hasTitleBar) {
+			data.top = new FormAttachment(tabbedPropertyComposite.getTitle(), 0);
+		} else {
+			data.top = new FormAttachment(0, 0);
+		}
+		data.bottom = new FormAttachment(100, 0);
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(100, 0);
+		result.setLayoutData(data);
+		return result;
+	}
+
+	private void setInput(IWorkbenchPart part, ISelection selection) {
+		if (selection.equals(currentSelection)) {
+			return;
+		}
+
+		this.currentSelection = selection;
+
+		// see if the selection provides a new contributor
+		validateRegistry(selection);
+		ITabDescriptor[] descriptors = registry.getTabDescriptors(part,
+				currentSelection);
+		// If there are no descriptors for the given input we do not need to
+		// touch the tab objects. We might reuse them for the next valid
+		// input.
+		if (descriptors.length > 0) {
+			updateTabs(descriptors);
+		}
+		// update tabs list
+		tabbedPropertyViewer.setInput(part, currentSelection);
+		int lastTabSelectionIndex = getLastTabSelection(part, currentSelection);
+		Object selectedTab = tabbedPropertyViewer
+			.getElementAt(lastTabSelectionIndex);
+		selectionQueueLocked = true;
+		try {
+			if (selectedTab == null) {
+				tabbedPropertyViewer.setSelection(null);
+			} else {
+				tabbedPropertyViewer.setSelection(new StructuredSelection(
+					selectedTab));
+			}
+		} finally {
+			selectionQueueLocked = false;
+		}
+		refreshTitleBar();
+	}
+
+	/**
+	 * Refresh the currently active tab.
+	 */
+	public void refresh() {
+		currentTab.refresh();
+	}
+
+	/**
+	 * Get the currently active tab.
+	 *
+	 * @return the currently active tab.
+	 * @since 3.4
+	 */
+	public TabContents getCurrentTab() {
+		return currentTab;
+	}
+
+	/**
+	 * Handle the tab selected change event.
+	 *
+	 * @param tabDescriptor
+	 *            the new selected tab.
+	 */
+	private void handleTabSelection(ITabDescriptor tabDescriptor) {
+		if (selectionQueueLocked) {
+			/*
+			 * don't send tab selection events for non user changes.
+			 */
+			return;
+		}
+		for (Iterator i = tabSelectionListeners.iterator(); i.hasNext();) {
+			ITabSelectionListener listener = (ITabSelectionListener) i.next();
+			listener.tabSelected(tabDescriptor);
+		}
+	}
+
+	/**
+	 * Add a tab selection listener.
+	 *
+	 * @param listener
+	 *            a tab selection listener.
+	 */
+	public void addTabSelectionListener(ITabSelectionListener listener) {
+		tabSelectionListeners.add(listener);
+	}
+
+	/**
+	 * Remove a tab selection listener.
+	 *
+	 * @param listener
+	 *            a tab selection listener.
+	 */
+	public void removeTabSelectionListener(ITabSelectionListener listener) {
+		tabSelectionListeners.remove(listener);
+	}
+
+	/**
+	 * Override the tabs with a new set of tabs. The tab list is obtained from
+	 * the {@link AbstractOverridableTabListPropertySection} by the
+	 * {@link IOverridableTabListContentProvider}.
+	 * @since 3.4
+	 */
+	public void overrideTabs() {
+		if (tabListContentProvider instanceof IOverridableTabListContentProvider) {
+			IOverridableTabListContentProvider overridableTabListContentProvider = (IOverridableTabListContentProvider) tabListContentProvider;
+			overridableTabListContentProvider.overrideTabs();
+		}
+	}
+
+	/**
+	 * Get the widget factory.
+	 *
+	 * @return the widget factory.
+	 */
+	public TabbedPropertySheetWidgetFactory getWidgetFactory() {
+		return widgetFactory;
+	}
+
+	/**
+	 * Update the title bar of the contributor has a label provider.
+	 */
+	private void refreshTitleBar() {
+		if (hasTitleBar) {
+			TabbedPropertyTitle title = tabbedPropertyComposite.getTitle();
+			if (currentTab == null) {
+				/**
+				 * No tabs are shown so hide the title bar, otherwise you see
+				 * "No properties available" and a title bar for the selection.
+				 */
+				title.setTitle(null, null);
+			} else {
+				String text = registry.getLabelProvider().getText(
+					currentSelection);
+				Image image = registry.getLabelProvider().getImage(
+					currentSelection);
+				title.setTitle(text, image);
+			}
+		}
+	}
+
+	/**
+	 * @see org.eclipse.jface.viewers.ILabelProviderListener#labelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
+	 */
+	public void labelProviderChanged(LabelProviderChangedEvent event) {
+		refreshTitleBar();
+	}
+
+    /**
+     * Retrieve the contributor from the selection.
+     *
+     * @param object -
+     *            the selected element
+     * @return the TabbedPropertySheetPageContributor or null if not applicable
+     */
+    private ITabbedPropertySheetPageContributor getTabbedPropertySheetPageContributor(
+            Object object) {
+        if (object instanceof ITabbedPropertySheetPageContributor) {
+            return (ITabbedPropertySheetPageContributor) object;
+        }
+
+        if (object instanceof IAdaptable
+            && ((IAdaptable) object)
+                .getAdapter(ITabbedPropertySheetPageContributor.class) != null) {
+            return (ITabbedPropertySheetPageContributor) (((IAdaptable) object)
+                .getAdapter(ITabbedPropertySheetPageContributor.class));
+        }
+
+        if (Platform.getAdapterManager().hasAdapter(object,
+            ITabbedPropertySheetPageContributor.class.getName())) {
+            return (ITabbedPropertySheetPageContributor) Platform
+                .getAdapterManager().loadAdapter(object,
+                    ITabbedPropertySheetPageContributor.class.getName());
+        }
+
+        return null;
+	}
+
+	/**
+	 * The workbench part creates this instance of the TabbedPropertySheetPage
+	 * and implements ITabbedPropertySheetPageContributor which is unique
+	 * contributor id. This unique contributor id is used to load a registry
+	 * with the extension point This id matches the registry.
+	 * <p>
+	 * It is possible for elements in a selection to implement
+	 * ITabbedPropertySheetPageContributor to provide a different contributor id
+	 * and thus a differenent registry.
+	 *
+	 * @param selection
+	 *            the current selection in the active workbench part.
+	 */
+	private void validateRegistry(ISelection selection) {
+		if (selection == null) {
+			return;
+		}
+
+		if (!(selection instanceof IStructuredSelection)) {
+			return;
+		}
+
+		IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+		if (structuredSelection.size() == 0) {
+			return;
+		}
+
+        ITabbedPropertySheetPageContributor newContributor = getTabbedPropertySheetPageContributor(structuredSelection.getFirstElement());
+
+		if (newContributor == null) {
+			/**
+			 * selection does not implement or adapt ITabbedPropertySheetPageContributor.
+			 */
+			newContributor = contributor;
+		}
+
+        String selectionContributorId = newContributor.getContributorId();
+		if (selectionContributorId.equals(currentContributorId)) {
+			/**
+			 * selection has the same contributor id as current, so leave
+			 * existing registry.
+			 */
+			return;
+		}
+
+		/**
+		 * Selection implements ITabbedPropertySheetPageContributor different
+		 * than current contributor id, so make sure all elements implement the
+		 * new id. If all contributor id do not match, then fall back to default
+		 * contributor from the workbench part.
+		 */
+		Iterator i = structuredSelection.iterator();
+        i.next();
+		while (i.hasNext()) {
+            newContributor = getTabbedPropertySheetPageContributor(i.next());
+			if (newContributor == null || !newContributor.getContributorId().equals(selectionContributorId)) {
+				/**
+				 * fall back to use the default contributor id from the
+				 * workbench part.
+				 */
+				if (selectionContributor != null) {
+					disposeContributor();
+					currentContributorId = contributor.getContributorId();
+					initContributor(currentContributorId);
+				}
+				return;
+			}
+		}
+
+		/**
+		 * All the elements in the selection implement a new contributor id, so
+		 * use that id.
+		 */
+		disposeContributor();
+		currentContributorId = selectionContributorId;
+		initContributor(currentContributorId);
+        overrideActionBars();
+	}
+
+    /**
+     * Override the action bars for the selection based contributor.
+     */
+    private void overrideActionBars() {
+        if (registry.getActionProvider() != null ) {
+            IActionProvider actionProvider = registry.getActionProvider();
+            actionProvider.setActionBars(contributor, getSite().getActionBars());
+        }
+    }
+
+	/**
+	 * Returns the currently selected tab.
+	 *
+	 * @return the currently selected tab or <code>null</code> if there is no
+	 *         tab selected.
+	 * @since 3.5
+	 */
+	public ITabDescriptor getSelectedTab() {
+		int selectedTab = tabbedPropertyViewer.getSelectionIndex();
+		if (selectedTab != -1) {
+			Object object = tabbedPropertyViewer.getElementAt(selectedTab);
+			if (object instanceof ITabDescriptor) {
+				return (ITabDescriptor) object;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the list of currently active tabs.
+	 *
+	 * @return the currently active tabs.
+	 * @since 3.5
+	 */
+	public ITabDescriptor[] getActiveTabs() {
+		List elements = tabbedPropertyViewer.getElements();
+		if (elements != null && elements.size() > 0) {
+			ITabDescriptor[] tabDescriptors = (ITabDescriptor[]) elements
+					.toArray(new ITabDescriptor[0]);
+			return tabDescriptors;
+		}
+		return new ITabDescriptor[] {};
+	}
+
+	/**
+	 * Set the currently selected tab to be that of the provided tab id.
+	 *
+	 * @param id
+	 *            The string id of the tab to select.
+	 * @since 3.5
+	 */
+	public void setSelectedTab(String id) {
+		List elements = tabbedPropertyViewer.getElements();
+		if (elements != null && elements.size() > 0) {
+			for (Iterator i = elements.iterator(); i.hasNext();) {
+				ITabDescriptor tabDescriptor = (ITabDescriptor) i.next();
+				if (tabDescriptor.getId() != null &&
+						tabDescriptor.getId().equals(id)) {
+					tabbedPropertyViewer.setSelection(new StructuredSelection(
+							tabDescriptor), true);
+				}
+			}
+		}
+	}
+
+	/**
+     * Returns text of the properties title for given selection. If selection is null,
+     * then currentSelection is used
+     *
+	 * @param selection Selection whose properties title text is to be returned
+     * @return String representing title text.
+	 * @since 3.5
+     */
+    public String getTitleText(ISelection selection) {
+    	if (selection == null) {
+    		selection = currentSelection;
+    	}
+    	return registry.getLabelProvider().getText(selection);
+    }
+
+    /**
+     * Returns the title image for given selection. If selection is null,
+     * then currentSelection is used.
+     *
+     * @param selection Selection whose properties title image is to be returned
+     * @return Image that is used as a title image.
+     * @since 3.5
+     */
+    public Image getTitleImage(ISelection selection) {
+    	if (selection == null) {
+    		selection = currentSelection;
+    	}
+		return registry.getLabelProvider().getImage(selection);
+    }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetWidgetFactory.java b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetWidgetFactory.java
new file mode 100644
index 0000000..5668249
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetWidgetFactory.java
@@ -0,0 +1,225 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * 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
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.views.properties.tabbed;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * A FormToolkit customized for use by tabbed property sheet page.
+ *
+ * @author Anthony Hunter
+ */
+public class TabbedPropertySheetWidgetFactory
+    extends FormToolkit {
+
+    /**
+     * private constructor.
+     */
+    public TabbedPropertySheetWidgetFactory() {
+        super(Display.getCurrent());
+    }
+
+    /**
+     * Creates the tab folder as a part of the form.
+     *
+     * @param parent
+     *            the composite parent.
+     * @param style
+     *            the tab folder style.
+     * @return the tab folder
+     */
+    public CTabFolder createTabFolder(Composite parent, int style) {
+        CTabFolder tabFolder = new CTabFolder(parent, style);
+        return tabFolder;
+    }
+
+    /**
+     * Creates the tab item as a part of the tab folder.
+     *
+     * @param tabFolder
+     *            the parent.
+     * @param style
+     *            the tab folder style.
+     * @return the tab item.
+     */
+    public CTabItem createTabItem(CTabFolder tabFolder, int style) {
+        CTabItem tabItem = new CTabItem(tabFolder, style);
+        return tabItem;
+    }
+
+    /**
+     * Creates the list as a part of the form.
+     *
+     * @param parent
+     *            the composite parent.
+     * @param style
+     *            the list style.
+     * @return the list.
+     */
+    public List createList(Composite parent, int style) {
+        List list = new org.eclipse.swt.widgets.List(parent, style);
+        return list;
+    }
+
+    public Composite createComposite(Composite parent, int style) {
+        Composite c = super.createComposite(parent, style);
+//        paintBordersFor(c);
+        return c;
+    }
+
+    public Composite createComposite(Composite parent) {
+        Composite c = createComposite(parent, SWT.NONE);
+        return c;
+    }
+
+    /**
+     * Creates a plain composite as a part of the form.
+     *
+     * @param parent
+     *            the composite parent.
+     * @param style
+     *            the composite style.
+     * @return the composite.
+     */
+    public Composite createPlainComposite(Composite parent, int style) {
+        Composite c = super.createComposite(parent, style);
+        c.setBackground(parent.getBackground());
+//        paintBordersFor(c);
+        return c;
+    }
+
+    /**
+     * Creates a scrolled composite as a part of the form.
+     *
+     * @param parent
+     *            the composite parent.
+     * @param style
+     *            the composite style.
+     * @return the composite.
+     */
+    public ScrolledComposite createScrolledComposite(Composite parent, int style) {
+        ScrolledComposite scrolledComposite = new ScrolledComposite(parent,
+            style);
+        return scrolledComposite;
+    }
+
+    /**
+     * Creates a combo box as a part of the form.
+     *
+     * @param parent
+     *            the combo box parent.
+     * @param comboStyle
+     *            the combo box style.
+     * @return the combo box.
+     */
+    public CCombo createCCombo(Composite parent, int comboStyle) {
+        CCombo combo = new CCombo(parent, comboStyle);
+        adapt(combo, true, false);
+        // Bugzilla 145837 - workaround for no borders on Windows XP
+		if (getBorderStyle() == SWT.BORDER) {
+			combo.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+		}
+        return combo;
+    }
+
+    /**
+     * Creates a combo box as a part of the form.
+     *
+     * @param parent
+     *            the combo box parent.
+     * @return the combo box.
+     */
+    public CCombo createCCombo(Composite parent) {
+        return createCCombo(parent, SWT.FLAT | SWT.READ_ONLY);
+    }
+
+    /**
+     * Creates a group as a part of the form.
+     *
+     * @param parent
+     *            the group parent.
+     * @param text
+     *            the group title.
+     * @return the composite.
+     */
+    public Group createGroup(Composite parent, String text) {
+        Group group = new Group(parent, SWT.SHADOW_NONE);
+        group.setText(text);
+        group.setBackground(getColors().getBackground());
+        group.setForeground(getColors().getForeground());
+        return group;
+    }
+
+    /**
+     * Creates a flat form composite as a part of the form.
+     *
+     * @param parent
+     *            the composite parent.
+     * @return the composite.
+     */
+    public Composite createFlatFormComposite(Composite parent) {
+        Composite composite = createComposite(parent);
+        FormLayout layout = new FormLayout();
+        layout.marginWidth = ITabbedPropertyConstants.HSPACE + 2;
+        layout.marginHeight = ITabbedPropertyConstants.VSPACE;
+        layout.spacing = ITabbedPropertyConstants.VMARGIN + 1;
+        composite.setLayout(layout);
+        return composite;
+    }
+
+    /**
+     * Creates a label as a part of the form.
+     *
+     * @param parent
+     *            the label parent.
+     * @param text
+     *            the label text.
+     * @return the label.
+     */
+    public CLabel createCLabel(Composite parent, String text) {
+        return createCLabel(parent, text, SWT.NONE);
+    }
+
+    /**
+     * Creates a label as a part of the form.
+     *
+     * @param parent
+     *            the label parent.
+     * @param text
+     *            the label text.
+     * @param style
+     *            the label style.
+     * @return the label.
+     */
+    public CLabel createCLabel(Composite parent, String text, int style) {
+        final CLabel label = new CLabel(parent, style);
+        label.setBackground(parent.getBackground());
+        label.setText(text);
+        return label;
+    }
+
+    public void dispose() {
+        if (getColors() != null) {
+            super.dispose();
+        }
+    }
+}
diff --git a/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/package.html b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/package.html
new file mode 100644
index 0000000..a6397e0
--- /dev/null
+++ b/bundles/org.eclipse.rap.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/package.html
@@ -0,0 +1,14 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <title>Package-level Javadoc</title>
+</head>
+<body>
+Provides the Tabbed Properties framework. This allows client views and editors to
+provide a tabbed property sheet page to the Properties view. 
+See TabbedPropertySheetPage.
+The tabs and sections to show for the selected element(s) in the source part are
+defined by extensions to this plug-in's extension points.
+</body>
+</html>