diff --git a/lib/deserializers/xml/contact.rb b/lib/deserializers/xml/contact.rb
new file mode 100644
index 000000000..d0a2ce8f4
--- /dev/null
+++ b/lib/deserializers/xml/contact.rb
@@ -0,0 +1,39 @@
+module Deserializers
+ module Xml
+ class Contact
+ attr_reader :frame
+
+ def initialize(frame)
+ @frame = frame
+ end
+
+ def call
+ attributes = {
+ name: if_present('postalInfo name'),
+ org: if_present('postalInfo org'),
+ email: if_present('email'),
+ fax: if_present('fax'),
+ phone: if_present('voice'),
+
+ # Address fields
+ city: if_present('postalInfo addr city'),
+ zip: if_present('postalInfo addr pc'),
+ street: if_present('postalInfo addr street'),
+ state: if_present('postalInfo addr sp'),
+ country_code: if_present('postalInfo addr cc'),
+
+ # Auth info
+ auth_info: if_present('authInfo pw'),
+ }
+
+ attributes.compact
+ end
+
+ def if_present(css_path)
+ return unless frame.css(css_path).present?
+
+ frame.css(css_path).text
+ end
+ end
+ end
+end
diff --git a/test/lib/deserializers/xml/contact_test.rb b/test/lib/deserializers/xml/contact_test.rb
new file mode 100644
index 000000000..c755e8f24
--- /dev/null
+++ b/test/lib/deserializers/xml/contact_test.rb
@@ -0,0 +1,73 @@
+require 'test_helper'
+require 'deserializers/xml/contact'
+
+class DeserializersXmlContactTest < ActiveSupport::TestCase
+ def test_trims_empty_values
+ xml_string = <<-XML
+ XML
+
+ nokogiri_frame = Nokogiri::XML(xml_string).remove_namespaces!
+ instance = ::Deserializers::Xml::Contact.new(nokogiri_frame)
+ assert_equal instance.call, {}
+ end
+
+ def test_handles_update
+ xml_string = <<-XML
+
+
+
+
+
+ john-001
+
+
+ new name
+
+ +123.4
+ new-email@inbox.test
+
+
+
+
+
+ XML
+
+ nokogiri_frame = Nokogiri::XML(xml_string).remove_namespaces!
+ instance = ::Deserializers::Xml::Contact.new(nokogiri_frame)
+ assert_equal instance.call, { name: 'new name',
+ email: 'new-email@inbox.test',
+ phone: '+123.4' }
+ end
+
+ def test_handles_create
+ name = 'new'
+ email = 'new@registrar.test'
+ phone = '+1.2'
+
+ xml_string = <<-XML
+
+
+
+
+
+
+ #{name}
+
+ #{phone}
+ #{email}
+
+
+
+
+ any
+
+
+
+
+ XML
+
+ nokogiri_frame = Nokogiri::XML(xml_string).remove_namespaces!
+ instance = ::Deserializers::Xml::Contact.new(nokogiri_frame)
+ assert_equal instance.call, { name: 'new', email: 'new@registrar.test', phone: '+1.2' }
+ end
+end