diff --git a/lib/geocoder.rb b/lib/geocoder.rb
index 583924b906e788157364b7506946552ede471731..3b28027fb8e1ea7924f0f9e2c265e5a31b4e9a28 100644
--- a/lib/geocoder.rb
+++ b/lib/geocoder.rb
@@ -3,6 +3,7 @@ require "geocoder/calculations"
 require "geocoder/lookup"
 require "geocoder/result"
 require "geocoder/active_record"
+require "geocoder/railtie"
 
 module Geocoder
   extend self
@@ -19,46 +20,4 @@ module Geocoder
   class ConfigurationError < Error; end
 end
 
-
-##
-# Add methods to ActiveRecord::Base so Geocoder is accessible by models.
-#
-ActiveRecord::Base.class_eval do
-
-  ##
-  # Set attribute names and include the Geocoder module.
-  #
-  def self.geocoded_by(address_attr, options = {})
-    _geocoder_init(
-      :user_address => address_attr,
-      :latitude  => options[:latitude]  || :latitude,
-      :longitude => options[:longitude] || :longitude
-    )
-  end
-
-  ##
-  # Set attribute names and include the Geocoder module.
-  #
-  def self.reverse_geocoded_by(latitude_attr, longitude_attr, options = {})
-    _geocoder_init(
-      :fetched_address => options[:address] || :address,
-      :latitude  => latitude_attr,
-      :longitude => longitude_attr
-    )
-  end
-
-  def self._geocoder_init(options)
-    unless _geocoder_initialized?
-      class_inheritable_reader :geocoder_options
-      class_inheritable_hash_writer :geocoder_options
-    end
-    self.geocoder_options = options
-    unless _geocoder_initialized?
-      include Geocoder::ActiveRecord
-    end
-  end
-
-  def self._geocoder_initialized?
-    included_modules.include? Geocoder::ActiveRecord
-  end
-end
+Geocoder::Railtie.insert
diff --git a/lib/geocoder/railtie.rb b/lib/geocoder/railtie.rb
new file mode 100644
index 0000000000000000000000000000000000000000..20bad2412df726763add39ad3cda228867700ca6
--- /dev/null
+++ b/lib/geocoder/railtie.rb
@@ -0,0 +1,68 @@
+require 'geocoder'
+
+module Geocoder
+  if defined? Rails::Railtie
+    require 'rails'
+    class Railtie < Rails::Railtie
+      initializer 'geocoder.insert_into_active_record' do
+        ActiveSupport.on_load :active_record do
+          Geocoder::Railtie.insert
+        end
+      end
+      rake_tasks do
+        load "tasks/geocoder.rake"
+      end
+    end
+  end
+
+  class Railtie
+    def self.insert
+
+      return unless defined?(::ActiveRecord)
+
+      ##
+      # Add methods to ActiveRecord::Base so Geocoder is accessible by models.
+      #
+      ::ActiveRecord::Base.class_eval do
+
+        ##
+        # Set attribute names and include the Geocoder module.
+        #
+        def self.geocoded_by(address_attr, options = {})
+          _geocoder_init(
+            :user_address => address_attr,
+            :latitude  => options[:latitude]  || :latitude,
+            :longitude => options[:longitude] || :longitude
+          )
+        end
+
+        ##
+        # Set attribute names and include the Geocoder module.
+        #
+        def self.reverse_geocoded_by(latitude_attr, longitude_attr, options = {})
+          _geocoder_init(
+            :fetched_address => options[:address] || :address,
+            :latitude  => latitude_attr,
+            :longitude => longitude_attr
+          )
+        end
+
+        def self._geocoder_init(options)
+          unless _geocoder_initialized?
+            class_inheritable_reader :geocoder_options
+            class_inheritable_hash_writer :geocoder_options
+          end
+          self.geocoder_options = options
+          unless _geocoder_initialized?
+            include Geocoder::ActiveRecord
+          end
+        end
+
+        def self._geocoder_initialized?
+          included_modules.include? Geocoder::ActiveRecord
+        end
+      end
+
+    end
+  end
+end