diff --git a/lib/ci/api/builds.rb b/lib/ci/api/builds.rb
index 15faa6edd8402c2ca4a11a8c7493db453153f1b3..2aaa06a022c4aaaaebc8bc679dc5302bad964a8c 100644
--- a/lib/ci/api/builds.rb
+++ b/lib/ci/api/builds.rb
@@ -78,11 +78,15 @@ module Ci
         # Parameters:
         #   id (required) - The ID of a build
         #   token (required) - The build authorization token
-        #   file (required) - The uploaded file
+        #   file (required) - Artifacts file
+        #   metadata (optional) - Artifacts metadata file
         # Parameters (accelerated by GitLab Workhorse):
         #   file.path - path to locally stored body (generated by Workhorse)
         #   file.name - real filename as send in Content-Disposition
         #   file.type - real content type as send in Content-Type
+        #   metadata.path - path to locally stored body (generated by Workhorse)
+        #   metadata.name - real filename as send in Content-Disposition
+        #   metadata.type - real content type as send in Content-Type
         # Headers:
         #   BUILD-TOKEN (required) - The build authorization token, the same as token
         # Body:
@@ -98,10 +102,17 @@ module Ci
           authenticate_build_token!(build)
           forbidden!('build is not running') unless build.running?
 
-          file = uploaded_file!(:file, ArtifactUploader.artifacts_upload_path)
-          file_to_large! unless file.size < max_artifacts_size
+          artifacts_upload_path = ArtifactUploader.artifacts_upload_path
+          artifacts = uploaded_file!(:file, artifacts_upload_path)
+          file_to_large! unless artifacts.size < max_artifacts_size
+          artifacts_attributes = { artifacts_file: artifacts }
 
-          if build.update_attributes(artifacts_file: file)
+          if params[:metadata] || params['metadata.path'.to_sym]
+            metadata = uploaded_file!(:metadata, artifacts_upload_path)
+            artifacts_attributes.store(:artifacts_metadata, metadata)
+          end
+
+          if build.update_attributes(artifacts_attributes)
             present build, with: Entities::Build
           else
             render_validation_error!(build)
@@ -148,6 +159,7 @@ module Ci
           not_found! unless build
           authenticate_build_token!(build)
           build.remove_artifacts_file!
+          build.remove_artifacts_metadata!
         end
       end
     end
diff --git a/lib/ci/api/entities.rb b/lib/ci/api/entities.rb
index e4ac0545ea2f5f707f07adfe2f14ecb0eea5f6d8..dd34c661e259d43306c28f92c2c852bffe7be9e8 100644
--- a/lib/ci/api/entities.rb
+++ b/lib/ci/api/entities.rb
@@ -31,6 +31,7 @@ module Ci
 
         expose :variables
         expose :artifacts_file, using: ArtifactFile
+        expose :artifacts_metadata, using: ArtifactFile
       end
 
       class Runner < Grape::Entity
diff --git a/spec/requests/ci/api/builds_spec.rb b/spec/requests/ci/api/builds_spec.rb
index c27e87c4acce8dc5aed72444ad19b9f57ba6e590..4eb5f2e6828942730b9250143c572f375cef9b87 100644
--- a/spec/requests/ci/api/builds_spec.rb
+++ b/spec/requests/ci/api/builds_spec.rb
@@ -210,6 +210,31 @@ describe Ci::API::API do
             end
           end
 
+          context "should post artifacts metadata" do
+            let!(:artifacts) { file_upload }
+            let!(:metadata) { file_upload2 }
+
+            before do
+              build.run!
+
+              post_data = {
+                'file.path' => artifacts.path,
+                'file.name' => artifacts.original_filename,
+                'metadata.path' => metadata.path,
+                'metadata.name' => metadata.original_filename
+              }
+
+              post post_url, post_data, headers_with_token
+            end
+
+            it 'stores artifacts and artifacts metadata' do
+              expect(response.status).to eq(201)
+              expect(json_response['artifacts_file']['filename']).to eq(artifacts.original_filename)
+              expect(json_response['artifacts_metadata']['filename']).to eq(metadata.original_filename)
+            end
+          end
+
+
           context "should fail to post too large artifact" do
             before do
               build.run!