diff --git a/Library/Homebrew/cmd/bottle.rb b/Library/Homebrew/cmd/bottle.rb
index 138e482e0d0fee50fb4e2f0792eaa6fd634b452e..888e8c778975d0306e0ecc55dfa7e80b7a8ee486 100644
--- a/Library/Homebrew/cmd/bottle.rb
+++ b/Library/Homebrew/cmd/bottle.rb
@@ -279,10 +279,9 @@ module Homebrew
     end
     bottle.rebuild rebuild
     sha256 = bottle_path.sha256
-    bottle.sha256 sha256 => Utils::Bottles.tag
 
-    old_spec = f.bottle_specification
-    if ARGV.include?("--keep-old") && !old_spec.checksums.empty?
+    if ARGV.include?("--keep-old") && !f.bottle_specification.checksums.empty?
+      old_spec = f.bottle_specification
       bad_fields = [:root_url, :prefix, :cellar, :rebuild].select do |field|
         old_spec.send(field) != bottle.send(field)
       end
@@ -291,8 +290,11 @@ module Homebrew
         bottle_path.unlink if bottle_path.exist?
         odie "--keep-old is passed but there are changes in: #{bad_fields.join ", "}"
       end
+      bottle = old_spec
     end
 
+    bottle.sha256 sha256 => Utils::Bottles.tag
+
     output = bottle_output bottle
 
     puts "./#{filename}"
@@ -323,6 +325,19 @@ module Homebrew
           },
         },
       }
+      if ARGV.include?("--keep-old")
+        bottle.checksums.each do |hash_type, checksums|
+          checksums.each do |checksum_hash|
+            checksum_hash.each do |checksum, tag|
+              tag_hash = {}
+              tag_hash["filename"] ||= Bottle::Filename.create(f, tag, rebuild).to_s
+              tag_hash[hash_type.to_s] ||= checksum.hexdigest
+              json[f.full_name]["bottle"]["tags"][tag.to_s] ||= tag_hash
+            end
+          end
+        end
+      end
+
       File.open("#{filename.prefix}.bottle.json", "w") do |file|
         file.write Utils::JSON.dump json
       end