diff --git a/app/controllers/api/keys_controller.rb b/app/controllers/api/keys_controller.rb
index 7eb76ee675f7c5fde6c13289c91ecd8e713adc25..32ccc197a1bc3d743071a996c2c3d7fa575a1f8e 100644
--- a/app/controllers/api/keys_controller.rb
+++ b/app/controllers/api/keys_controller.rb
@@ -5,14 +5,11 @@ class Api::KeysController < ApiController
 
   # get /keys
   def index
-    keys = identity.keys.map do |k,v|
-      [k, JSON.parse(v)]
-    end
-    render json: keys.to_h
+    render json: identity.keys
   end
 
   def show
-    render json: JSON.parse(identity.keys[params[:id]])
+    render json: identity.keys[params[:id]]
   end
 
   def create
diff --git a/app/controllers/api/users_controller.rb b/app/controllers/api/users_controller.rb
index 65b80c7d7d4eeb82990f885b2122a99989604b2f..eda37e8bcfa4e079f47cef993a0a0abe79217418 100644
--- a/app/controllers/api/users_controller.rb
+++ b/app/controllers/api/users_controller.rb
@@ -112,7 +112,7 @@ module Api
       PgpKey.new(key).tap do |key|
         if key.valid?
           identity = Identity.for(@user)
-          identity.set_key(:pgp, key)
+          identity.set_key(:pgp, key.to_s)
           identity.save
         end
       end
diff --git a/app/models/identity.rb b/app/models/identity.rb
index b8c2245630b9d2672d18cbf567396a306140df6f..13ce124c0f76091f7c17ca4ca6fbe8cd71772d5b 100644
--- a/app/models/identity.rb
+++ b/app/models/identity.rb
@@ -131,9 +131,10 @@ class Identity < CouchRest::Model::Base
     read_attribute('keys') || HashWithIndifferentAccess.new
   end
 
-  def set_key(type, key)
-    return if keys[type] == key.to_s
-    write_attribute('keys', keys.merge(type => key.to_s))
+  def set_key(type, key_hash)
+    key_hash.stringify_keys! if key_hash.respond_to? :stringify_keys!
+    return if keys[type] == key_hash
+    write_attribute('keys', keys.merge(type => key_hash))
   end
 
   def delete_key(type)
diff --git a/app/models/keyring.rb b/app/models/keyring.rb
index 66f7bfdbaf08b379078d48200170938ebf8c52ed..a5320c2b3101910fda07ebb916f4f6269b3fd682 100644
--- a/app/models/keyring.rb
+++ b/app/models/keyring.rb
@@ -20,13 +20,13 @@ class Keyring
 
   def create(type, value)
     raise Error, "key already exists" if storage.keys[type].present?
-    storage.set_key type, {type: type, value: value, rev: new_rev}.to_json
+    storage.set_key type, {type: type, value: value, rev: new_rev}
     storage.save
   end
 
   def update(type, rev:, value:)
     check_rev type, rev
-    storage.set_key type, {type: type, value: value, rev: new_rev}.to_json
+    storage.set_key type, {type: type, value: value, rev: new_rev}
     storage.save
   end
 
@@ -37,7 +37,7 @@ class Keyring
   end
 
   def key_of_type(type)
-    JSON.parse(storage.keys[type]) if storage.keys[type]
+    storage.keys[type]
   end
 
   protected
@@ -46,6 +46,9 @@ class Keyring
   def check_rev(type, rev)
     old = key_of_type(type)
     raise NotFound, type unless old
+    # We used to store plain strings. It's deprecated now.
+    # If we happen to run into them do not check their revision.
+    return if old.is_a? String
     raise Error, "wrong revision: #{rev}" unless old['rev'] == rev
   end
 
diff --git a/features/step_definitions/key_steps.rb b/features/step_definitions/key_steps.rb
index 3d5e015492985b743e8af67fa3a33b41bfc5f6d9..ad3fac65f97b3a24080feafb3ea55797414f21f1 100644
--- a/features/step_definitions/key_steps.rb
+++ b/features/step_definitions/key_steps.rb
@@ -16,7 +16,7 @@ Then /^I should have published an? "([^"]*)" key(?: with value "([^"]*)")?$/ do
   identity = Identity.for(@user)
   keys = identity.keys
   assert_includes keys.keys, type
-  assert_equal value, JSON.parse(keys[type])['value'] if value
+  assert_equal value, keys[type]['value'] if value
 end
 
 Then /^I should not have published an? "([^"]*)" key$/ do |type|
diff --git a/test/unit/keyring_test.rb b/test/unit/keyring_test.rb
index c7df63e948722eedf671035a9ff4fa34e0624b65..48bab2952665b21ab00ede8e6f309f527f1fac3f 100644
--- a/test/unit/keyring_test.rb
+++ b/test/unit/keyring_test.rb
@@ -82,8 +82,8 @@ class KeyringTest < ActiveSupport::TestCase
 
   def teststorage
     @teststorage ||= Hash.new.tap do |dummy|
-      def dummy.set_key(type, value)
-        self[type] = value
+      def dummy.set_key(type, hash)
+        self[type] = hash.stringify_keys
       end
 
       def dummy.keys