Initial checkin
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..eb5a316
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+target
diff --git a/org.springframework.build.aws.maven/.classpath b/org.springframework.build.aws.maven/.classpath
new file mode 100644
index 0000000..49140ee
--- /dev/null
+++ b/org.springframework.build.aws.maven/.classpath
@@ -0,0 +1,13 @@
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar" sourcepath="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.2/commons-codec-1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/net/java/dev/jets3t/jets3t/0.5.1-20080115/jets3t-0.6.0.jar" sourcepath="M2_REPO/net/java/dev/jets3t/jets3t/0.5.1-20080115/jets3t-0.6.0-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4-sources.jar"/>
+</classpath>
\ No newline at end of file
diff --git a/org.springframework.build.aws.maven/.project b/org.springframework.build.aws.maven/.project
new file mode 100644
index 0000000..23247a8
--- /dev/null
+++ b/org.springframework.build.aws.maven/.project
@@ -0,0 +1,13 @@
+<projectDescription>
+  <name>org.springframework.build.aws.maven</name>
+  <comment>Standard Maven wagon support for s3:// urls</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
+</projectDescription>
\ No newline at end of file
diff --git a/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.core.prefs b/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3a378cf
--- /dev/null
+++ b/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,259 @@
+#Tue Nov 13 08:43:58 EST 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+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=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=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=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=do not 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.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.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_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.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=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.ui.prefs b/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..c9e3c77
--- /dev/null
+++ b/org.springframework.build.aws.maven/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Tue Nov 13 08:43:58 EST 2007
+eclipse.preferences.version=1
+formatter_profile=_Spring
+formatter_settings_version=11
diff --git a/org.springframework.build.aws.maven/pom.xml b/org.springframework.build.aws.maven/pom.xml
new file mode 100644
index 0000000..711e803
--- /dev/null
+++ b/org.springframework.build.aws.maven/pom.xml
@@ -0,0 +1,73 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.springframework.build.aws</groupId>
+    <artifactId>org.springframework.build.aws.maven</artifactId>
+    <packaging>jar</packaging>
+    <name>Amazon Web Services Maven Wagon Support</name>
+    <version>2.0.1.BUILD-SNAPSHOT</version>
+    <description>
+        Standard Maven wagon support for s3:// urls
+    </description>
+    <url>http://www.springframework.org</url>
+    <inceptionYear>2007</inceptionYear>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+    <scm>
+        <connection>scm:svn:https://springframework.svn.sourceforge.net/svnroot/springframework/spring-aws/trunk</connection>
+        <developerConnection>scm:svn:https://springframework.svn.sourceforge.net/svnroot/springframework/spring-aws/trunk</developerConnection>
+        <url>http://fisheye3.cenqua.com/browse/springframework/spring-aws/trunk</url>
+    </scm>
+    <organization>
+        <name>Spring Framework</name>
+        <url>http://www.springframework.org</url>
+    </organization>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <dependencies>
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>net.java.dev.jets3t</groupId>
+            <artifactId>jets3t</artifactId>
+            <version>0.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.wagon</groupId>
+            <artifactId>wagon-provider-api</artifactId>
+            <version>1.0-beta-2</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+    <distributionManagement>
+        <repository>
+            <id>spring-milestone</id>
+            <name>Spring Milestone Repository</name>
+            <url>s3://maven.springframework.org/snapshot</url>
+        </repository>
+        <snapshotRepository>
+            <id>spring-snapshot</id>
+            <name>Spring Snapshot Repository</name>
+            <url>s3://maven.springframework.org/snapshot</url>
+        </snapshotRepository>
+    </distributionManagement>
+</project>
\ No newline at end of file
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/AbstractWagon.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/AbstractWagon.java
new file mode 100644
index 0000000..1e1c760
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/AbstractWagon.java
@@ -0,0 +1,364 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.aws.maven;
+
+import org.apache.maven.wagon.ConnectionException;
+import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.TransferFailedException;
+import org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.authentication.AuthenticationException;
+import org.apache.maven.wagon.authentication.AuthenticationInfo;
+import org.apache.maven.wagon.authorization.AuthorizationException;
+import org.apache.maven.wagon.events.SessionListener;
+import org.apache.maven.wagon.events.TransferEvent;
+import org.apache.maven.wagon.events.TransferListener;
+import org.apache.maven.wagon.proxy.ProxyInfo;
+import org.apache.maven.wagon.repository.Repository;
+import org.apache.maven.wagon.resource.Resource;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * An abstract implementation of the Wagon interface. This implementation
+ * manages listener and other common behaviors.
+ * 
+ * @author Ben Hale
+ * @since 1.1
+ */
+public abstract class AbstractWagon implements Wagon {
+
+	private boolean interactive;
+
+	private Repository repository;
+
+	private boolean supportsDirectoryCopy;
+
+	private SessionListenerSupport sessionListeners = new SessionListenerSupport(this);
+
+	private TransferListenerSupport transferListeners = new TransferListenerSupport(this);
+
+	protected AbstractWagon(boolean supportsDirectoryCopy) {
+		this.supportsDirectoryCopy = supportsDirectoryCopy;
+	}
+
+	public final void addSessionListener(SessionListener listener) {
+		sessionListeners.addListener(listener);
+	}
+
+	protected final SessionListenerSupport getSessionListeners() {
+		return sessionListeners;
+	}
+
+	public final boolean hasSessionListener(SessionListener listener) {
+		return sessionListeners.hasListener(listener);
+	}
+
+	public final void removeSessionListener(SessionListener listener) {
+		sessionListeners.removeListener(listener);
+	}
+
+	public final void addTransferListener(TransferListener listener) {
+		transferListeners.addListener(listener);
+	}
+
+	protected final TransferListenerSupport getTransferListeners() {
+		return transferListeners;
+	}
+
+	public final boolean hasTransferListener(TransferListener listener) {
+		return transferListeners.hasListener(listener);
+	}
+
+	public final void removeTransferListener(TransferListener listener) {
+		transferListeners.removeListener(listener);
+	}
+
+	public final Repository getRepository() {
+		return repository;
+	}
+
+	public final boolean isInteractive() {
+		return interactive;
+	}
+
+	public final void setInteractive(boolean interactive) {
+		this.interactive = interactive;
+	}
+
+	public final void connect(Repository source) throws ConnectionException, AuthenticationException {
+		connect(source, null, null);
+	}
+
+	public final void connect(Repository source, ProxyInfo proxyInfo) throws ConnectionException,
+			AuthenticationException {
+		connect(source, null, proxyInfo);
+	}
+
+	public final void connect(Repository source, AuthenticationInfo authenticationInfo) throws ConnectionException,
+			AuthenticationException {
+		connect(source, authenticationInfo, null);
+	}
+
+	public final void connect(Repository source, AuthenticationInfo authenticationInfo, ProxyInfo proxyInfo)
+			throws ConnectionException, AuthenticationException {
+		repository = source;
+		sessionListeners.fireSessionOpening();
+		try {
+			connectToRepository(source, authenticationInfo, proxyInfo);
+		}
+		catch (ConnectionException e) {
+			sessionListeners.fireSessionConnectionRefused();
+			throw e;
+		}
+		catch (AuthenticationException e) {
+			sessionListeners.fireSessionConnectionRefused();
+			throw e;
+		}
+		catch (Exception e) {
+			sessionListeners.fireSessionConnectionRefused();
+			throw new ConnectionException("Could not connect to repository", e);
+		}
+		sessionListeners.fireSessionLoggedIn();
+		sessionListeners.fireSessionOpened();
+	}
+
+	public final void disconnect() throws ConnectionException {
+		sessionListeners.fireSessionDisconnecting();
+		try {
+			disconnectFromRepository();
+		}
+		catch (ConnectionException e) {
+			sessionListeners.fireSessionConnectionRefused();
+			throw e;
+		}
+		catch (Exception e) {
+			sessionListeners.fireSessionConnectionRefused();
+			throw new ConnectionException("Could not disconnect from repository", e);
+		}
+		sessionListeners.fireSessionLoggedOff();
+		sessionListeners.fireSessionDisconnected();
+	}
+
+	public final void get(String resourceName, File destination) throws TransferFailedException,
+			ResourceDoesNotExistException, AuthorizationException {
+		Resource resource = new Resource(resourceName);
+		transferListeners.fireTransferInitiated(resource, TransferEvent.REQUEST_GET);
+		transferListeners.fireTransferStarted(resource, TransferEvent.REQUEST_GET);
+
+		try {
+			getResource(resourceName, destination, new TransferProgress(resource, TransferEvent.REQUEST_GET,
+					transferListeners));
+			transferListeners.fireTransferCompleted(resource, TransferEvent.REQUEST_GET);
+		}
+		catch (TransferFailedException e) {
+			throw e;
+		}
+		catch (ResourceDoesNotExistException e) {
+			throw e;
+		}
+		catch (AuthorizationException e) {
+			throw e;
+		}
+		catch (Exception e) {
+			transferListeners.fireTransferError(resource, TransferEvent.REQUEST_GET, e);
+			throw new TransferFailedException("Transfer of resource " + destination + "failed", e);
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	public final List getFileList(String destinationDirectory) throws TransferFailedException,
+			ResourceDoesNotExistException, AuthorizationException {
+		try {
+			return listDirectory(destinationDirectory);
+		}
+		catch (TransferFailedException e) {
+			throw e;
+		}
+		catch (ResourceDoesNotExistException e) {
+			throw e;
+		}
+		catch (AuthorizationException e) {
+			throw e;
+		}
+		catch (Exception e) {
+			sessionListeners.fireSessionError(e);
+			throw new TransferFailedException("Listing of directory " + destinationDirectory + "failed", e);
+		}
+	}
+
+	public final boolean getIfNewer(String resourceName, File destination, long timestamp)
+			throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException {
+		Resource resource = new Resource(resourceName);
+		try {
+			if (isRemoteResourceNewer(resourceName, timestamp)) {
+				get(resourceName, destination);
+				return true;
+			}
+			else {
+				return false;
+			}
+		}
+		catch (TransferFailedException e) {
+			throw e;
+		}
+		catch (ResourceDoesNotExistException e) {
+			throw e;
+		}
+		catch (AuthorizationException e) {
+			throw e;
+		}
+		catch (Exception e) {
+			transferListeners.fireTransferError(resource, TransferEvent.REQUEST_GET, e);
+			throw new TransferFailedException("Transfer of resource " + destination + "failed", e);
+		}
+	}
+
+	public final void openConnection() throws ConnectionException, AuthenticationException {
+		// Nothing to do here (never called by the wagon manager)
+	}
+
+	public final void put(File source, String destination) throws TransferFailedException,
+			ResourceDoesNotExistException, AuthorizationException {
+		Resource resource = new Resource(destination);
+		transferListeners.fireTransferInitiated(resource, TransferEvent.REQUEST_PUT);
+		transferListeners.fireTransferStarted(resource, TransferEvent.REQUEST_PUT);
+
+		try {
+			putResource(source, destination, new TransferProgress(resource, TransferEvent.REQUEST_PUT,
+					transferListeners));
+			transferListeners.fireTransferCompleted(resource, TransferEvent.REQUEST_PUT);
+		}
+		catch (TransferFailedException e) {
+			throw e;
+		}
+		catch (ResourceDoesNotExistException e) {
+			throw e;
+		}
+		catch (AuthorizationException e) {
+			throw e;
+		}
+		catch (Exception e) {
+			transferListeners.fireTransferError(resource, TransferEvent.REQUEST_PUT, e);
+			throw new TransferFailedException("Transfer of resource " + destination + "failed", e);
+		}
+	}
+
+	public final void putDirectory(File sourceDirectory, String destinationDirectory) throws TransferFailedException,
+			ResourceDoesNotExistException, AuthorizationException {
+		for (File f : sourceDirectory.listFiles()) {
+			put(f, destinationDirectory + "/" + f.getName());
+		}
+	}
+
+	public final boolean resourceExists(String resourceName) throws TransferFailedException, AuthorizationException {
+		try {
+			return doesRemoteResourceExist(resourceName);
+		}
+		catch (TransferFailedException e) {
+			throw e;
+		}
+		catch (AuthorizationException e) {
+			throw e;
+		}
+		catch (Exception e) {
+			sessionListeners.fireSessionError(e);
+			throw new TransferFailedException("Listing of resource " + resourceName + "failed", e);
+		}
+	}
+
+	public final boolean supportsDirectoryCopy() {
+		return supportsDirectoryCopy;
+	}
+
+	/**
+	 * Subclass must implement with specific connection behavior
+	 * 
+	 * @param source The repository connection information
+	 * @param authenticationInfo Authentication information, if any
+	 * @param proxyInfo Proxy information, if any
+	 * @throws Exception Implementations can throw any exception and it will be
+	 * handled by the base class
+	 */
+	protected abstract void connectToRepository(Repository source, AuthenticationInfo authenticationInfo,
+			ProxyInfo proxyInfo) throws Exception;
+
+	/**
+	 * Subclass must implement with specific detection behavior
+	 * 
+	 * @param resourceName The remote resource to detect
+	 * @return true if the remote resource exists
+	 * @throws Exception Implementations can throw any exception and it will be
+	 * handled by the base class
+	 */
+	protected abstract boolean doesRemoteResourceExist(String resourceName) throws Exception;
+
+	/**
+	 * Subclasses must implement with specific disconnection behavior
+	 * 
+	 * @throws Exception Implementations can throw any exception and it will be
+	 * handled by the base class
+	 */
+	protected abstract void disconnectFromRepository() throws Exception;
+
+	/**
+	 * Subclass must implement with specific get behavior
+	 * 
+	 * @param resourceName The name of the remote resource to read
+	 * @param destination The local file to write to
+	 * @param progress A progress notifier for the upload. It must be used or
+	 * hashes will not be calculated correctly
+	 * @throws Exception Implementations can throw any exception and it will be
+	 * handled by the base class
+	 */
+	protected abstract void getResource(String resourceName, File destination, TransferProgress progress)
+			throws Exception;
+
+	/**
+	 * Subclass must implement with newer detection behavior
+	 * 
+	 * @param resourceName The name of the resource being compared
+	 * @param timestamp The timestamp to compare against
+	 * @return true if the current version of the resource is newer than the
+	 * timestamp
+	 * @throws Exception Implementations can throw any exception and it will be
+	 * handled by the base class
+	 */
+	protected abstract boolean isRemoteResourceNewer(String resourceName, long timestamp) throws Exception;
+
+	/**
+	 * Subclass must implement with specific directory listing behavior
+	 * 
+	 * @param directory The directory to list files in
+	 * @return A collection of file names
+	 * @throws Exception Implementations can throw any exception and it will be
+	 * handled by the base class
+	 */
+	protected abstract List<String> listDirectory(String directory) throws Exception;
+
+	/**
+	 * Subclasses must implement with specific put behavior
+	 * 
+	 * @param source The local source file to read from
+	 * @param destination The name of the remote resource to write to
+	 * @param progress A progress notifier for the upload. It must be used or
+	 * hashes will not be calculated correctly
+	 * @throws Exception Implementations can throw any exception and it will be
+	 * handled by the base class
+	 */
+	protected abstract void putResource(File source, String destination, TransferProgress progress) throws Exception;
+
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SessionListenerSupport.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SessionListenerSupport.java
new file mode 100644
index 0000000..5de3f9c
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SessionListenerSupport.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.aws.maven;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.events.SessionEvent;
+import org.apache.maven.wagon.events.SessionListener;
+
+/**
+ * Support for sending messages to Maven session listeners. Automates the
+ * collection of listeners and the iteration over that collection when an event
+ * is fired.
+ * 
+ * @author Ben Hale
+ */
+class SessionListenerSupport {
+
+	private Wagon wagon;
+
+	private Set<SessionListener> listeners = new HashSet<SessionListener>();
+
+	/**
+	 * Creates a new instance
+	 * @param wagon The wagon that events will come from
+	 */
+	public SessionListenerSupport(Wagon wagon) {
+		this.wagon = wagon;
+	}
+
+	/**
+	 * Adds a listener to the collection
+	 * @param listener The listener to add
+	 */
+	public void addListener(SessionListener listener) {
+		listeners.add(listener);
+	}
+
+	/**
+	 * Removes a listener from the collection
+	 * @param listener The listener to remove
+	 */
+	public void removeListener(SessionListener listener) {
+		listeners.remove(listener);
+	}
+
+	/**
+	 * Whether the collection already contains a listener
+	 * @param listener The listener to check for
+	 * @return Whether the collection contains a listener
+	 */
+	public boolean hasListener(SessionListener listener) {
+		return listeners.contains(listener);
+	}
+
+	/**
+	 * Sends a session opening event to all listeners
+	 * @see SessionEvent#SESSION_OPENING
+	 */
+	public void fireSessionOpening() {
+		SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_OPENING);
+		for (SessionListener listener : listeners) {
+			listener.sessionOpening(event);
+		}
+	}
+
+	/**
+	 * Sends a session opened event to all listeners
+	 * @see SessionEvent#SESSION_OPENED
+	 */
+	public void fireSessionOpened() {
+		SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_OPENED);
+		for (SessionListener listener : listeners) {
+			listener.sessionOpened(event);
+		}
+	}
+
+	/**
+	 * Sends a session disconnecting event to all listeners
+	 * @see SessionEvent#SESSION_DISCONNECTING
+	 */
+	public void fireSessionDisconnecting() {
+		SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_DISCONNECTING);
+		for (SessionListener listener : listeners) {
+			listener.sessionDisconnecting(event);
+		}
+	}
+
+	/**
+	 * Sends a session disconnected event to all listeners
+	 * @see SessionEvent#SESSION_DISCONNECTED
+	 */
+	public void fireSessionDisconnected() {
+		SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_DISCONNECTED);
+		for (SessionListener listener : listeners) {
+			listener.sessionDisconnected(event);
+		}
+	}
+
+	/**
+	 * Sends a session connection refused event to all listeners
+	 * @see SessionEvent#SESSION_CONNECTION_REFUSED
+	 */
+	public void fireSessionConnectionRefused() {
+		SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_CONNECTION_REFUSED);
+		for (SessionListener listener : listeners) {
+			listener.sessionConnectionRefused(event);
+		}
+	}
+
+	/**
+	 * Sends a session logged in event to all listeners
+	 * @see SessionEvent#SESSION_LOGGED_IN
+	 */
+	public void fireSessionLoggedIn() {
+		SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_LOGGED_IN);
+		for (SessionListener listener : listeners) {
+			listener.sessionLoggedIn(event);
+		}
+	}
+
+	/**
+	 * Sends a session logged off event to all listeners
+	 * @see SessionEvent#SESSION_LOGGED_OFF
+	 */
+	public void fireSessionLoggedOff() {
+		SessionEvent event = new SessionEvent(wagon, SessionEvent.SESSION_LOGGED_OFF);
+		for (SessionListener listener : listeners) {
+			listener.sessionLoggedOff(event);
+		}
+	}
+
+	/**
+	 * Sends a session error event to all listeners
+	 * @param e The session error
+	 */
+	public void fireSessionError(Exception e) {
+		SessionEvent event = new SessionEvent(wagon, e);
+		for (SessionListener listener : listeners) {
+			listener.sessionError(event);
+		}
+	}
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SimpleStorageServiceWagon.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SimpleStorageServiceWagon.java
new file mode 100644
index 0000000..6fb37e0
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/SimpleStorageServiceWagon.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.aws.maven;
+
+import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.authentication.AuthenticationException;
+import org.apache.maven.wagon.authentication.AuthenticationInfo;
+import org.apache.maven.wagon.proxy.ProxyInfo;
+import org.apache.maven.wagon.repository.Repository;
+import org.jets3t.service.S3Service;
+import org.jets3t.service.S3ServiceException;
+import org.jets3t.service.acl.AccessControlList;
+import org.jets3t.service.impl.rest.httpclient.RestS3Service;
+import org.jets3t.service.model.S3Bucket;
+import org.jets3t.service.model.S3Object;
+import org.jets3t.service.security.AWSCredentials;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * An implementation of the Maven Wagon interface that allows you to access the
+ * Amazon S3 service. URLs that reference the S3 service should be in the form
+ * of <code>s3://bucket.name</code>. As an example
+ * <code>s3://static.springframework.org</code> would put files into the
+ * <code>static.springframework.org</code> bucket on the S3 service. <p/> This
+ * implementation uses the <code>username</code> and <code>passphrase</code>
+ * portions of the server authentication metadata for credentials.
+ * 
+ * @author Ben Hale
+ */
+public class SimpleStorageServiceWagon extends AbstractWagon {
+
+	private S3Service service;
+
+	private S3Bucket bucket;
+
+	private String basedir;
+
+	public SimpleStorageServiceWagon() {
+		super(false);
+	}
+
+	protected void connectToRepository(Repository source, AuthenticationInfo authenticationInfo, ProxyInfo proxyInfo)
+			throws AuthenticationException {
+		try {
+			service = new RestS3Service(getCredentials(authenticationInfo));
+		}
+		catch (S3ServiceException e) {
+			throw new AuthenticationException("Cannot authenticate with current credentials", e);
+		}
+		bucket = new S3Bucket(source.getHost());
+		basedir = getBaseDir(source);
+	}
+
+	protected boolean doesRemoteResourceExist(String resourceName) {
+		try {
+			service.getObjectDetails(bucket, basedir + resourceName);
+		}
+		catch (S3ServiceException e) {
+			return false;
+		}
+		return true;
+	}
+
+	protected void disconnectFromRepository() {
+		// Nothing to do for S3
+	}
+
+	protected void getResource(String resourceName, File destination, TransferProgress progress)
+			throws ResourceDoesNotExistException, S3ServiceException, IOException {
+		S3Object object;
+		try {
+			object = service.getObject(bucket, basedir + resourceName);
+		}
+		catch (S3ServiceException e) {
+			throw new ResourceDoesNotExistException("Resource " + resourceName + " does not exist in the repository", e);
+		}
+
+		if(!destination.getParentFile().exists()) {
+			destination.getParentFile().mkdirs();
+		}
+
+		InputStream in = null;
+		OutputStream out = null;
+		try {
+			in = object.getDataInputStream();
+			out = new TransferProgressFileOutputStream(destination, progress);
+			byte[] buffer = new byte[1024];
+			int length;
+			while ((length = in.read(buffer)) != -1) {
+				out.write(buffer, 0, length);
+			}
+		}
+		finally {
+			if (in != null) {
+				try {
+					in.close();
+				}
+				catch (IOException e) {
+					// Nothing possible at this point
+				}
+			}
+			if (out != null) {
+				try {
+					out.close();
+				}
+				catch (IOException e) {
+					// Nothing possible at this point
+				}
+			}
+		}
+	}
+
+	protected boolean isRemoteResourceNewer(String resourceName, long timestamp) throws S3ServiceException {
+		S3Object object = service.getObjectDetails(bucket, basedir + resourceName);
+		return object.getLastModifiedDate().compareTo(new Date(timestamp)) < 0;
+	}
+
+	protected List<String> listDirectory(String directory) throws Exception {
+		S3Object[] objects = service.listObjects(bucket, basedir + directory, "");
+		List<String> fileNames = new ArrayList<String>(objects.length);
+		for (S3Object object : objects) {
+			fileNames.add(object.getKey());
+		}
+		return fileNames;
+	}
+
+	protected void putResource(File source, String destination, TransferProgress progress) throws S3ServiceException,
+			IOException {
+		buildDestinationPath(getDestinationPath(destination));
+		S3Object object = new S3Object(basedir + destination);
+		object.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
+		object.setDataInputFile(source);
+		object.setContentLength(source.length());
+
+		InputStream in = null;
+		try {
+			service.putObject(bucket, object);
+
+			in = new FileInputStream(source);
+			byte[] buffer = new byte[1024];
+			int length;
+			while ((length = in.read(buffer)) != -1) {
+				progress.notify(buffer, length);
+			}
+		}
+		finally {
+			if (in != null) {
+				try {
+					in.close();
+				}
+				catch (IOException e) {
+					// Nothing possible at this point
+				}
+			}
+		}
+	}
+
+	private void buildDestinationPath(String destination) throws S3ServiceException {
+		S3Object object = new S3Object(basedir + destination + "/");
+		object.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
+		object.setContentLength(0);
+		service.putObject(bucket, object);
+		int index = destination.lastIndexOf('/');
+		if (index != -1) {
+			buildDestinationPath(destination.substring(0, index));
+		}
+	}
+
+	private String getDestinationPath(String destination) {
+		return destination.substring(0, destination.lastIndexOf('/'));
+	}
+
+	private String getBaseDir(Repository source) {
+		StringBuilder sb = new StringBuilder(source.getBasedir());
+		sb.deleteCharAt(0);
+		if (sb.charAt(sb.length() - 1) != '/') {
+			sb.append('/');
+		}
+		return sb.toString();
+	}
+
+	private AWSCredentials getCredentials(AuthenticationInfo authenticationInfo) throws AuthenticationException {
+		if (authenticationInfo == null) {
+			return null;
+		}
+		String accessKey = authenticationInfo.getUserName();
+		String secretKey = authenticationInfo.getPassphrase();
+		if (accessKey == null || secretKey == null) {
+			throw new AuthenticationException("S3 requires a username and passphrase to be set");
+		}
+		return new AWSCredentials(accessKey, secretKey);
+	}
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferListenerSupport.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferListenerSupport.java
new file mode 100644
index 0000000..7ed1eff
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferListenerSupport.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.aws.maven;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.events.TransferEvent;
+import org.apache.maven.wagon.events.TransferListener;
+import org.apache.maven.wagon.resource.Resource;
+
+/**
+ * Support for sending messages to Maven transfer listeners. Automates the
+ * collection of listeners and the iteration over that collection when an event
+ * is fired.
+ * 
+ * @author Ben Hale
+ */
+class TransferListenerSupport {
+
+	private Wagon wagon;
+
+	private Set<TransferListener> listeners = new HashSet<TransferListener>();
+
+	/**
+	 * Creates a new instance
+	 * @param wagon The wagon that events will come from
+	 */
+	public TransferListenerSupport(Wagon wagon) {
+		this.wagon = wagon;
+	}
+
+	/**
+	 * Adds a listener to the collection
+	 * @param listener The listener to add
+	 */
+	public void addListener(TransferListener listener) {
+		listeners.add(listener);
+	}
+
+	/**
+	 * Removes a listener from the collection
+	 * @param listener The listener to remove
+	 */
+	public void removeListener(TransferListener listener) {
+		listeners.remove(listener);
+	}
+
+	/**
+	 * Whether the collection already contains a listener
+	 * @param listener The listener to check for
+	 * @return whether the collection contains the listener
+	 */
+	public boolean hasListener(TransferListener listener) {
+		return listeners.contains(listener);
+	}
+
+	/**
+	 * Sends a transfer initated event to all listeners
+	 * @param resource The resource being transfered
+	 * @param requestType GET or PUT request
+	 * @see TransferEvent#TRANSFER_INITIATED
+	 */
+	public void fireTransferInitiated(Resource resource, int requestType) {
+		TransferEvent event = new TransferEvent(wagon, resource, TransferEvent.TRANSFER_INITIATED, requestType);
+		for (TransferListener listener : listeners) {
+			listener.transferInitiated(event);
+		}
+	}
+
+	/**
+	 * Sends a transfer started event to all listeners
+	 * @param resource The resource being transfered
+	 * @param requestType GET or PUT request
+	 * @see TransferEvent#TRANSFER_STARTED
+	 */
+	public void fireTransferStarted(Resource resource, int requestType) {
+		TransferEvent event = new TransferEvent(wagon, resource, TransferEvent.TRANSFER_STARTED, requestType);
+		for (TransferListener listener : listeners) {
+			listener.transferStarted(event);
+		}
+	}
+
+	public void fireTransferProgress(Resource resource, int requestType, byte[] buffer, int length) {
+		TransferEvent event = new TransferEvent(wagon, resource, TransferEvent.TRANSFER_PROGRESS, requestType);
+		for (TransferListener listener : listeners) {
+			listener.transferProgress(event, buffer, length);
+		}
+	}
+
+	/**
+	 * Sends a transfer completed event to all listeners
+	 * @param resource The resource being transfered
+	 * @param requestType GET or PUT request
+	 * @see TransferEvent#TRANSFER_COMPLETED
+	 */
+	public void fireTransferCompleted(Resource resource, int requestType) {
+		TransferEvent event = new TransferEvent(wagon, resource, TransferEvent.TRANSFER_COMPLETED, requestType);
+		for (TransferListener listener : listeners) {
+			listener.transferCompleted(event);
+		}
+	}
+
+	/**
+	 * Sends a transfer error event to all listeners
+	 * @param resource The resource being transfered
+	 * @param requestType GET or PUT request
+	 * @param e The transfer error
+	 */
+	public void fireTransferError(Resource resource, int requestType, Exception e) {
+		TransferEvent event = new TransferEvent(wagon, resource, e, requestType);
+		for (TransferListener listener : listeners) {
+			listener.transferError(event);
+		}
+	}
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgress.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgress.java
new file mode 100644
index 0000000..6fbce32
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgress.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.aws.maven;
+
+import org.apache.maven.wagon.resource.Resource;
+
+/**
+ * A class that encapsulates the notification of the transfer listeners for
+ * Maven Wagon.
+ * 
+ * @author Ben Hale
+ * @since 1.1
+ */
+class TransferProgress {
+
+	private Resource resource;
+
+	private int requestType;
+
+	private TransferListenerSupport transferListeners;
+
+	public TransferProgress(Resource resource, int requestType, TransferListenerSupport listeners) {
+		this.resource = resource;
+		this.requestType = requestType;
+		this.transferListeners = listeners;
+	}
+
+	protected void notify(byte[] buffer, int length) {
+		transferListeners.fireTransferProgress(resource, requestType, buffer, length);
+	}
+
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileInputStream.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileInputStream.java
new file mode 100644
index 0000000..fa4b434
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileInputStream.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.aws.maven;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+/**
+ * An extension to the {@link FileInputStream} that notifies a
+ * @{link TransferProgress} object as it is being written to.
+ * 
+ * @author Ben Hale
+ * @since 1.1
+ */
+public class TransferProgressFileInputStream extends FileInputStream {
+
+	private TransferProgress progress;
+
+	public TransferProgressFileInputStream(File file, TransferProgress progress) throws FileNotFoundException {
+		super(file);
+		this.progress = progress;
+	}
+
+	public int read() throws IOException {
+		int b = super.read();
+		progress.notify(new byte[] { (byte) b }, 1);
+		return b;
+	}
+
+	public int read(byte b[]) throws IOException {
+		int count = super.read(b);
+		progress.notify(b, b.length);
+		return count;
+	}
+
+	public int read(byte b[], int off, int len) throws IOException {
+		int count = super.read(b, off, len);
+		if (off == 0) {
+			progress.notify(b, len);
+		}
+		else {
+			byte[] bytes = new byte[len];
+			System.arraycopy(b, off, bytes, 0, len);
+			progress.notify(bytes, len);
+		}
+		return count;
+	}
+}
diff --git a/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileOutputStream.java b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileOutputStream.java
new file mode 100644
index 0000000..7984a48
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/java/org/springframework/aws/maven/TransferProgressFileOutputStream.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2004-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.aws.maven;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * An extension to the {@link FileOutputStream} that notifies a
+ * @{link TransferProgress} object as it is being written to.
+ * 
+ * @author Ben Hale
+ * @since 1.1
+ */
+class TransferProgressFileOutputStream extends FileOutputStream {
+
+	private TransferProgress progress;
+
+	public TransferProgressFileOutputStream(File file, TransferProgress progress) throws FileNotFoundException {
+		super(file);
+		this.progress = progress;
+	}
+
+	public void write(int b) throws IOException {
+		super.write(b);
+		progress.notify(new byte[] { (byte) b }, 1);
+	}
+
+	public void write(byte b[]) throws IOException {
+		super.write(b);
+		progress.notify(b, b.length);
+	}
+
+	public void write(byte b[], int off, int len) throws IOException {
+		super.write(b, off, len);
+		if (off == 0) {
+			progress.notify(b, len);
+		}
+		else {
+			byte[] bytes = new byte[len];
+			System.arraycopy(b, off, bytes, 0, len);
+			progress.notify(bytes, len);
+		}
+	}
+}
diff --git a/org.springframework.build.aws.maven/src/main/resources/META-INF/plexus/components.xml b/org.springframework.build.aws.maven/src/main/resources/META-INF/plexus/components.xml
new file mode 100644
index 0000000..1373d4d
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/resources/META-INF/plexus/components.xml
@@ -0,0 +1,10 @@
+<component-set>
+    <components>
+        <component>
+            <role>org.apache.maven.wagon.Wagon</role>
+            <role-hint>s3</role-hint>
+            <implementation>org.springframework.aws.maven.SimpleStorageServiceWagon</implementation>
+            <instantiation-strategy>per-lookup</instantiation-strategy>
+        </component>
+    </components>
+</component-set>
diff --git a/org.springframework.build.aws.maven/src/main/resources/mime.types b/org.springframework.build.aws.maven/src/main/resources/mime.types
new file mode 100644
index 0000000..83d948e
--- /dev/null
+++ b/org.springframework.build.aws.maven/src/main/resources/mime.types
@@ -0,0 +1,602 @@
+# This is a comment. I love comments.
+
+# This file controls what Internet media types are sent to the client for
+# given file extension(s).  Sending the correct media type to the client
+# is important so they know how to handle the content of the file.
+# Extra types can either be added here or by using an AddType directive
+# in your config files. For more information about Internet media types,
+# please read RFC 2045, 2046, 2047, 2048, and 2077.  The Internet media type
+# registry is at <http://www.iana.org/assignments/media-types/>.
+
+# MIME type			Extensions
+application/activemessage
+application/andrew-inset	ez
+application/applefile
+application/atom+xml		atom
+application/atomicmail
+application/batch-smtp
+application/beep+xml
+application/cals-1840
+application/cnrp+xml
+application/commonground
+application/cpl+xml
+application/cybercash
+application/dca-rft
+application/dec-dx
+application/dvcs
+application/edi-consent
+application/edifact
+application/edi-x12
+application/eshop
+application/font-tdpfr
+application/http
+application/hyperstudio
+application/iges
+application/index
+application/index.cmd
+application/index.obj
+application/index.response
+application/index.vnd
+application/iotp
+application/ipp
+application/isup
+application/mac-binhex40	hqx
+application/mac-compactpro	cpt
+application/macwriteii
+application/marc
+application/mathematica
+application/mathml+xml		mathml
+application/msword		doc
+application/news-message-id
+application/news-transmission
+application/ocsp-request
+application/ocsp-response
+application/octet-stream	bin dms lha lzh exe class so dll dmg
+application/oda			oda
+application/ogg			ogg
+application/parityfec
+application/pdf			pdf
+application/pgp-encrypted
+application/pgp-keys
+application/pgp-signature
+application/pkcs10
+application/pkcs7-mime
+application/pkcs7-signature
+application/pkix-cert
+application/pkix-crl
+application/pkixcmp
+application/postscript		ai eps ps
+application/prs.alvestrand.titrax-sheet
+application/prs.cww
+application/prs.nprend
+application/prs.plucker
+application/qsig
+application/rdf+xml		rdf
+application/reginfo+xml
+application/remote-printing
+application/riscos
+application/rtf
+application/sdp
+application/set-payment
+application/set-payment-initiation
+application/set-registration
+application/set-registration-initiation
+application/sgml
+application/sgml-open-catalog
+application/sieve
+application/slate
+application/smil		smi smil
+application/srgs		gram
+application/srgs+xml		grxml
+application/timestamp-query
+application/timestamp-reply
+application/tve-trigger
+application/vemmi
+application/vnd.3gpp.pic-bw-large
+application/vnd.3gpp.pic-bw-small
+application/vnd.3gpp.pic-bw-var
+application/vnd.3gpp.sms
+application/vnd.3m.post-it-notes
+application/vnd.accpac.simply.aso
+application/vnd.accpac.simply.imp
+application/vnd.acucobol
+application/vnd.acucorp
+application/vnd.adobe.xfdf
+application/vnd.aether.imp
+application/vnd.amiga.ami
+application/vnd.anser-web-certificate-issue-initiation
+application/vnd.anser-web-funds-transfer-initiation
+application/vnd.audiograph
+application/vnd.blueice.multipass
+application/vnd.bmi
+application/vnd.businessobjects
+application/vnd.canon-cpdl
+application/vnd.canon-lips
+application/vnd.cinderella
+application/vnd.claymore
+application/vnd.commerce-battelle
+application/vnd.commonspace
+application/vnd.contact.cmsg
+application/vnd.cosmocaller
+application/vnd.criticaltools.wbs+xml
+application/vnd.ctc-posml
+application/vnd.cups-postscript
+application/vnd.cups-raster
+application/vnd.cups-raw
+application/vnd.curl
+application/vnd.cybank
+application/vnd.data-vision.rdz
+application/vnd.dna
+application/vnd.dpgraph
+application/vnd.dreamfactory
+application/vnd.dxr
+application/vnd.ecdis-update
+application/vnd.ecowin.chart
+application/vnd.ecowin.filerequest
+application/vnd.ecowin.fileupdate
+application/vnd.ecowin.series
+application/vnd.ecowin.seriesrequest
+application/vnd.ecowin.seriesupdate
+application/vnd.enliven
+application/vnd.epson.esf
+application/vnd.epson.msf
+application/vnd.epson.quickanime
+application/vnd.epson.salt
+application/vnd.epson.ssf
+application/vnd.ericsson.quickcall
+application/vnd.eudora.data
+application/vnd.fdf
+application/vnd.ffsns
+application/vnd.fints
+application/vnd.flographit
+application/vnd.framemaker
+application/vnd.fsc.weblaunch
+application/vnd.fujitsu.oasys
+application/vnd.fujitsu.oasys2
+application/vnd.fujitsu.oasys3
+application/vnd.fujitsu.oasysgp
+application/vnd.fujitsu.oasysprs
+application/vnd.fujixerox.ddd
+application/vnd.fujixerox.docuworks
+application/vnd.fujixerox.docuworks.binder
+application/vnd.fut-misnet
+application/vnd.grafeq
+application/vnd.groove-account
+application/vnd.groove-help
+application/vnd.groove-identity-message
+application/vnd.groove-injector
+application/vnd.groove-tool-message
+application/vnd.groove-tool-template
+application/vnd.groove-vcard
+application/vnd.hbci
+application/vnd.hhe.lesson-player
+application/vnd.hp-hpgl
+application/vnd.hp-hpid
+application/vnd.hp-hps
+application/vnd.hp-pcl
+application/vnd.hp-pclxl
+application/vnd.httphone
+application/vnd.hzn-3d-crossword
+application/vnd.ibm.afplinedata
+application/vnd.ibm.electronic-media
+application/vnd.ibm.minipay
+application/vnd.ibm.modcap
+application/vnd.ibm.rights-management
+application/vnd.ibm.secure-container
+application/vnd.informix-visionary
+application/vnd.intercon.formnet
+application/vnd.intertrust.digibox
+application/vnd.intertrust.nncp
+application/vnd.intu.qbo
+application/vnd.intu.qfx
+application/vnd.irepository.package+xml
+application/vnd.is-xpr
+application/vnd.japannet-directory-service
+application/vnd.japannet-jpnstore-wakeup
+application/vnd.japannet-payment-wakeup
+application/vnd.japannet-registration
+application/vnd.japannet-registration-wakeup
+application/vnd.japannet-setstore-wakeup
+application/vnd.japannet-verification
+application/vnd.japannet-verification-wakeup
+application/vnd.jisp
+application/vnd.kde.karbon
+application/vnd.kde.kchart
+application/vnd.kde.kformula
+application/vnd.kde.kivio
+application/vnd.kde.kontour
+application/vnd.kde.kpresenter
+application/vnd.kde.kspread
+application/vnd.kde.kword
+application/vnd.kenameaapp
+application/vnd.koan
+application/vnd.liberty-request+xml
+application/vnd.llamagraphics.life-balance.desktop
+application/vnd.llamagraphics.life-balance.exchange+xml
+application/vnd.lotus-1-2-3
+application/vnd.lotus-approach
+application/vnd.lotus-freelance
+application/vnd.lotus-notes
+application/vnd.lotus-organizer
+application/vnd.lotus-screencam
+application/vnd.lotus-wordpro
+application/vnd.mcd
+application/vnd.mediastation.cdkey
+application/vnd.meridian-slingshot
+application/vnd.micrografx.flo
+application/vnd.micrografx.igx
+application/vnd.mif		mif
+application/vnd.minisoft-hp3000-save
+application/vnd.mitsubishi.misty-guard.trustweb
+application/vnd.mobius.daf
+application/vnd.mobius.dis
+application/vnd.mobius.mbk
+application/vnd.mobius.mqy
+application/vnd.mobius.msl
+application/vnd.mobius.plc
+application/vnd.mobius.txf
+application/vnd.mophun.application
+application/vnd.mophun.certificate
+application/vnd.motorola.flexsuite
+application/vnd.motorola.flexsuite.adsi
+application/vnd.motorola.flexsuite.fis
+application/vnd.motorola.flexsuite.gotap
+application/vnd.motorola.flexsuite.kmr
+application/vnd.motorola.flexsuite.ttc
+application/vnd.motorola.flexsuite.wem
+application/vnd.mozilla.xul+xml	xul
+application/vnd.ms-artgalry
+application/vnd.ms-asf
+application/vnd.ms-excel	xls
+application/vnd.ms-lrm
+application/vnd.ms-powerpoint	ppt
+application/vnd.ms-project
+application/vnd.ms-tnef
+application/vnd.ms-works
+application/vnd.ms-wpl
+application/vnd.mseq
+application/vnd.msign
+application/vnd.music-niff
+application/vnd.musician
+application/vnd.netfpx
+application/vnd.noblenet-directory
+application/vnd.noblenet-sealer
+application/vnd.noblenet-web
+application/vnd.novadigm.edm
+application/vnd.novadigm.edx
+application/vnd.novadigm.ext
+application/vnd.obn
+application/vnd.osa.netdeploy
+application/vnd.palm
+application/vnd.pg.format
+application/vnd.pg.osasli
+application/vnd.powerbuilder6
+application/vnd.powerbuilder6-s
+application/vnd.powerbuilder7
+application/vnd.powerbuilder7-s
+application/vnd.powerbuilder75
+application/vnd.powerbuilder75-s
+application/vnd.previewsystems.box
+application/vnd.publishare-delta-tree
+application/vnd.pvi.ptid1
+application/vnd.pwg-multiplexed
+application/vnd.pwg-xhtml-print+xml
+application/vnd.quark.quarkxpress
+application/vnd.rapid
+application/vnd.rn-realmedia	rm
+application/vnd.s3sms
+application/vnd.sealed.net
+application/vnd.seemail
+application/vnd.shana.informed.formdata
+application/vnd.shana.informed.formtemplate
+application/vnd.shana.informed.interchange
+application/vnd.shana.informed.package
+application/vnd.smaf
+application/vnd.sss-cod
+application/vnd.sss-dtf
+application/vnd.sss-ntf
+application/vnd.street-stream
+application/vnd.svd
+application/vnd.swiftview-ics
+application/vnd.triscape.mxs
+application/vnd.trueapp
+application/vnd.truedoc
+application/vnd.ufdl
+application/vnd.uplanet.alert
+application/vnd.uplanet.alert-wbxml
+application/vnd.uplanet.bearer-choice
+application/vnd.uplanet.bearer-choice-wbxml
+application/vnd.uplanet.cacheop
+application/vnd.uplanet.cacheop-wbxml
+application/vnd.uplanet.channel
+application/vnd.uplanet.channel-wbxml
+application/vnd.uplanet.list
+application/vnd.uplanet.list-wbxml
+application/vnd.uplanet.listcmd
+application/vnd.uplanet.listcmd-wbxml
+application/vnd.uplanet.signal
+application/vnd.vcx
+application/vnd.vectorworks
+application/vnd.vidsoft.vidconference
+application/vnd.visio
+application/vnd.visionary
+application/vnd.vividence.scriptfile
+application/vnd.vsf
+application/vnd.wap.sic
+application/vnd.wap.slc
+application/vnd.wap.wbxml	wbxml
+application/vnd.wap.wmlc	wmlc
+application/vnd.wap.wmlscriptc	wmlsc
+application/vnd.webturbo
+application/vnd.wrq-hp3000-labelled
+application/vnd.wt.stf
+application/vnd.wv.csp+wbxml
+application/vnd.xara
+application/vnd.xfdl
+application/vnd.yamaha.hv-dic
+application/vnd.yamaha.hv-script
+application/vnd.yamaha.hv-voice
+application/vnd.yellowriver-custom-menu
+application/voicexml+xml	vxml
+application/watcherinfo+xml
+application/whoispp-query
+application/whoispp-response
+application/wita
+application/wordperfect5.1
+application/x-bcpio		bcpio
+application/x-cdlink		vcd
+application/x-chess-pgn		pgn
+application/x-compress
+application/x-cpio		cpio
+application/x-csh		csh
+application/x-director		dcr dir dxr
+application/x-dvi		dvi
+application/x-futuresplash	spl
+application/x-gtar		gtar
+application/x-gzip		gz
+application/x-hdf		hdf
+application/x-javascript	js
+application/x-java-jnlp-file	jnlp
+application/x-koan		skp skd skt skm
+application/x-latex		latex
+application/x-netcdf		nc cdf
+application/x-sh		sh
+application/x-shar		shar
+application/x-shockwave-flash	swf
+application/x-stuffit		sit
+application/x-sv4cpio		sv4cpio
+application/x-sv4crc		sv4crc
+application/x-tar		tar
+application/x-tcl		tcl
+application/x-tex		tex
+application/x-texinfo		texinfo texi
+application/x-troff		t tr roff
+application/x-troff-man		man
+application/x-troff-me		me
+application/x-troff-ms		ms
+application/x-ustar		ustar
+application/x-wais-source	src
+application/x400-bp
+application/xhtml+xml		xhtml xht
+application/xslt+xml		xslt
+application/xml			xml xsl
+application/xml-dtd		dtd
+application/xml-external-parsed-entity
+application/zip			zip
+audio/32kadpcm
+audio/amr
+audio/amr-wb
+audio/basic			au snd
+audio/cn
+audio/dat12
+audio/dsr-es201108
+audio/dvi4
+audio/evrc
+audio/evrc0
+audio/g722
+audio/g.722.1
+audio/g723
+audio/g726-16
+audio/g726-24
+audio/g726-32
+audio/g726-40
+audio/g728
+audio/g729
+audio/g729D
+audio/g729E
+audio/gsm
+audio/gsm-efr
+audio/l8
+audio/l16
+audio/l20
+audio/l24
+audio/lpc
+audio/midi			mid midi kar
+audio/mpa
+audio/mpa-robust
+audio/mp4a-latm			m4a m4p
+audio/mpeg			mpga mp2 mp3
+audio/parityfec
+audio/pcma
+audio/pcmu
+audio/prs.sid
+audio/qcelp
+audio/red
+audio/smv
+audio/smv0
+audio/telephone-event
+audio/tone
+audio/vdvi
+audio/vnd.3gpp.iufp
+audio/vnd.cisco.nse
+audio/vnd.cns.anp1
+audio/vnd.cns.inf1
+audio/vnd.digital-winds
+audio/vnd.everad.plj
+audio/vnd.lucent.voice
+audio/vnd.nortel.vbk
+audio/vnd.nuera.ecelp4800
+audio/vnd.nuera.ecelp7470
+audio/vnd.nuera.ecelp9600
+audio/vnd.octel.sbc
+audio/vnd.qcelp
+audio/vnd.rhetorex.32kadpcm
+audio/vnd.vmx.cvsd
+audio/x-aiff			aif aiff aifc
+audio/x-alaw-basic
+audio/x-mpegurl			m3u
+audio/x-pn-realaudio		ram ra
+audio/x-pn-realaudio-plugin
+audio/x-wav			wav
+chemical/x-pdb			pdb
+chemical/x-xyz			xyz
+image/bmp			bmp
+image/cgm			cgm
+image/g3fax
+image/gif			gif
+image/ief			ief
+image/jpeg			jpeg jpg jpe
+image/jp2			jp2
+image/naplps
+image/pict			pict pic pct
+image/png			png
+image/prs.btif
+image/prs.pti
+image/svg+xml			svg
+image/t38
+image/tiff			tiff tif
+image/tiff-fx
+image/vnd.cns.inf2
+image/vnd.djvu			djvu djv
+image/vnd.dwg
+image/vnd.dxf
+image/vnd.fastbidsheet
+image/vnd.fpx
+image/vnd.fst
+image/vnd.fujixerox.edmics-mmr
+image/vnd.fujixerox.edmics-rlc
+image/vnd.globalgraphics.pgb
+image/vnd.mix
+image/vnd.ms-modi
+image/vnd.net-fpx
+image/vnd.svf
+image/vnd.wap.wbmp		wbmp
+image/vnd.xiff
+image/x-cmu-raster		ras
+image/x-macpaint		pntg pnt mac
+image/x-icon			ico
+image/x-portable-anymap		pnm
+image/x-portable-bitmap		pbm
+image/x-portable-graymap	pgm
+image/x-portable-pixmap		ppm
+image/x-quicktime		qtif qti
+image/x-rgb			rgb
+image/x-xbitmap			xbm
+image/x-xpixmap			xpm
+image/x-xwindowdump		xwd
+message/delivery-status
+message/disposition-notification
+message/external-body
+message/http
+message/news
+message/partial
+message/rfc822
+message/s-http
+message/sip
+message/sipfrag
+model/iges			igs iges
+model/mesh			msh mesh silo
+model/vnd.dwf
+model/vnd.flatland.3dml
+model/vnd.gdl
+model/vnd.gs-gdl
+model/vnd.gtw
+model/vnd.mts
+model/vnd.parasolid.transmit.binary
+model/vnd.parasolid.transmit.text
+model/vnd.vtu
+model/vrml			wrl vrml
+multipart/alternative
+multipart/appledouble
+multipart/byteranges
+multipart/digest
+multipart/encrypted
+multipart/form-data
+multipart/header-set
+multipart/mixed
+multipart/parallel
+multipart/related
+multipart/report
+multipart/signed
+multipart/voice-message
+text/calendar			ics ifb
+text/css			css
+text/directory
+text/enriched
+text/html			html htm
+text/parityfec
+text/plain			asc txt
+text/prs.lines.tag
+text/rfc822-headers
+text/richtext			rtx
+text/rtf			rtf
+text/sgml			sgml sgm
+text/t140
+text/tab-separated-values	tsv
+text/uri-list
+text/vnd.abc
+text/vnd.curl
+text/vnd.dmclientscript
+text/vnd.fly
+text/vnd.fmi.flexstor
+text/vnd.in3d.3dml
+text/vnd.in3d.spot
+text/vnd.iptc.nitf
+text/vnd.iptc.newsml
+text/vnd.latex-z
+text/vnd.motorola.reflex
+text/vnd.ms-mediapackage
+text/vnd.net2phone.commcenter.command
+text/vnd.sun.j2me.app-descriptor
+text/vnd.wap.si
+text/vnd.wap.sl
+text/vnd.wap.wml		wml
+text/vnd.wap.wmlscript		wmls
+text/x-setext			etx
+text/xml
+text/xml-external-parsed-entity
+video/3gpp		3gp
+video/bmpeg
+video/bt656
+video/celb
+video/dv
+video/h261
+video/h263
+video/h263-1998
+video/h263-2000
+video/jpeg
+video/mp1s
+video/mp2p
+video/mp2t
+video/mp4			mp4
+video/mp4v-es
+video/mpv
+video/mpeg			mpeg mpg mpe
+video/nv
+video/parityfec
+video/pointer
+video/quicktime			qt mov
+video/smpte292m
+video/vnd.fvt
+video/vnd.motorola.video
+video/vnd.motorola.videop
+video/vnd.mpegurl		mxu m4u
+video/vnd.nokia.interleaved-multimedia
+video/vnd.objectvideo
+video/vnd.vivo
+video/x-dv			dv dif
+video/x-flv			flv
+video/x-ms-wmv		wmv
+video/x-msvideo			avi
+video/x-sgi-movie		movie
+x-conference/x-cooltalk		ice