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>
