diff --git a/lib/ipaddress/ipv4.rb b/lib/ipaddress/ipv4.rb
index 19ab14c50ffd8fb0c4aacdd95f6498beeb3df626..ade18510b57955dd9b3f2a58c5e1c8021eacc832 100644
--- a/lib/ipaddress/ipv4.rb
+++ b/lib/ipaddress/ipv4.rb
@@ -650,6 +650,20 @@ module IPAddress;
       [self.class.new("127.0.0.0/8")].any? {|i| i.include? self}
     end
 
+    #
+    # Checks if an IPv4 address objects belongs
+    # to a link-local network RFC3927
+    #
+    # Example:
+    #
+    #   ip = IPAddress "169.254.0.1"
+    #   ip.link_local?
+    #     #=> true
+    #
+    def link_local?
+      [self.class.new("169.254.0.0/16")].any? {|i| i.include? self}
+    end
+
     #
     # Returns the IP address in in-addr.arpa format
     # for DNS lookups
diff --git a/lib/ipaddress/ipv6.rb b/lib/ipaddress/ipv6.rb
index 3e506aca5afab8babc8b6871582981298980ffb9..adc6243460285a038a6672e968b5c7aca8981c0c 100644
--- a/lib/ipaddress/ipv6.rb
+++ b/lib/ipaddress/ipv6.rb
@@ -423,6 +423,34 @@ module IPAddress;
       @prefix == 128 and @compressed == "::1"
     end
 
+    #
+    # Checks if an IPv6 address objects belongs
+    # to a link-local network RFC4291
+    #
+    # Example:
+    #
+    #   ip = IPAddress "fe80::1"
+    #   ip.link_local?
+    #     #=> true
+    #
+    def link_local?
+      [self.class.new("fe80::/64")].any? {|i| i.include? self}
+    end
+
+    #
+    # Checks if an IPv6 address objects belongs
+    # to a unique-local network RFC4193
+    #
+    # Example:
+    #
+    #   ip = IPAddress "fc00::1"
+    #   ip.unique_local?
+    #     #=> true
+    #
+    def unique_local?
+      [self.class.new("fc00::/7")].any? {|i| i.include? self}
+    end
+
     # 
     # Returns true if the address is a mapped address
     # 
diff --git a/test/ipaddress/ipv4_test.rb b/test/ipaddress/ipv4_test.rb
index 56a78d0fd2b93a8e53a7abb0d3651a4f6eb67ac7..f39d68636185f4e74b3ecfc90f2742b1e4bc87cc 100644
--- a/test/ipaddress/ipv4_test.rb
+++ b/test/ipaddress/ipv4_test.rb
@@ -74,6 +74,22 @@ class IPv4Test < Minitest::Test
       "10.32.0.1" => ["10.32.0.253", 253],
       "192.0.0.0" => ["192.1.255.255", 131072]
     }
+
+    @link_local = [
+      "169.254.0.0",
+      "169.254.255.255",
+      "169.254.12.34",
+      "169.254.0.0/16",
+      "169.254.0.0/17"]
+    
+    @not_link_local = [
+      "127.0.0.1",
+      "127.0.1.1",
+      "192.168.0.100",
+      "169.255.0.0",
+      "169.254.0.0/15",
+      "0.0.0.0",
+      "255.255.255.255"]
     
   end
 
@@ -310,6 +326,15 @@ class IPv4Test < Minitest::Test
     assert_equal false, @klass.new("192.0.0.2/24").private?
   end
 
+  def test_method_link_local?
+    @link_local.each do |addr|
+      assert_equal true, @klass.new(addr).link_local?
+    end
+    @not_link_local.each do |addr|
+      assert_equal false, @klass.new(addr).link_local?
+    end
+  end
+
   def test_method_octet
     assert_equal 172, @ip[0]
     assert_equal 16, @ip[1]
diff --git a/test/ipaddress/ipv6_test.rb b/test/ipaddress/ipv6_test.rb
index b43c9de7cf3890e500101fc6c64c444d5989b56b..120aafb350010fc7590af420209a5a622e81f200 100644
--- a/test/ipaddress/ipv6_test.rb
+++ b/test/ipaddress/ipv6_test.rb
@@ -42,6 +42,37 @@ class IPv6Test < Minitest::Test
     @network = @klass.new "2001:db8:8:800::/64"
     @arr = [8193,3512,0,0,8,2048,8204,16762]
     @hex = "20010db80000000000080800200c417a"
+
+    @link_local = [
+      "fe80::",
+      "fe80::1",
+      "fe80::208:74ff:feda:625c",
+      "fe80::/64",
+      "fe80::/65"]
+    
+    @not_link_local = [
+      "::",
+      "::1",
+      "ff80:03:02:01::",
+      "2001:db8::8:800:200c:417a",
+      "fe80::/63"]
+
+    @unique_local = [
+      "fc00::/7",
+      "fc00::/8",
+      "fd00::/8",
+      "fd12:3456:789a:1::1",
+      "fd12:3456:789a:1::/64",
+      "fc00::1"]
+
+    @not_unique_local = [
+      "fc00::/6",
+      "::",
+      "::1",
+      "fe80::",
+      "fe80::1",
+      "fe80::/64"]
+    
   end
   
   def test_attribute_address
@@ -215,6 +246,24 @@ class IPv6Test < Minitest::Test
     assert_equal false, @ip.loopback?        
   end
 
+  def test_method_link_local?
+    @link_local.each do |addr|
+      assert_equal true, @klass.new(addr).link_local?
+    end
+    @not_link_local.each do |addr|
+      assert_equal false, @klass.new(addr).link_local?
+    end
+  end
+
+  def test_method_unique_local?
+    @unique_local.each do |addr|
+      assert_equal true, @klass.new(addr).unique_local?
+    end
+    @not_unique_local.each do |addr|
+      assert_equal false, @klass.new(addr).unique_local?
+    end
+  end
+
   def test_method_network
     @networks.each do |addr,net|
       ip = @klass.new addr