diff --git a/data/bitclust/template/class b/data/bitclust/template/class
index c88a7ad..e92c08f 100644
--- a/data/bitclust/template/class
+++ b/data/bitclust/template/class
@@ -5,6 +5,7 @@
   <meta http-equiv="Content-Language" content="ja-JP">
   <link rel="stylesheet" type="text/css" href="<%=h css_url() %>">
   <title><%=h @entry.type %> <%=h @entry.name %></title>
+  <link rel="search" type="application/opensearchdescription+xml" title="<%= _('Ruby %s Reference Manual', ruby_version()) %>" href="<%=h opensearchdescription_url() %>">
 </head>
 <body>
 
diff --git a/data/bitclust/template/class-index b/data/bitclust/template/class-index
index d3f8a2e..7118114 100644
--- a/data/bitclust/template/class-index
+++ b/data/bitclust/template/class-index
@@ -5,6 +5,7 @@
   <meta http-equiv="Content-Language" content="ja-JP">
   <link rel="stylesheet" type="text/css" href="<%=h css_url() %>">
   <title><%= _('Class Index') %></title>
+  <link rel="search" type="application/opensearchdescription+xml" title="<%= _('Ruby %s Reference Manual', ruby_version()) %>" href="<%=h opensearchdescription_url() %>">
 </head>
 <body>
 
diff --git a/data/bitclust/template/doc b/data/bitclust/template/doc
index 136cc35..5598983 100644
--- a/data/bitclust/template/doc
+++ b/data/bitclust/template/doc
@@ -5,6 +5,7 @@
   <meta http-equiv="Content-Language" content="ja-JP">
   <link rel="stylesheet" type="text/css" href="<%=h css_url() %>">
   <title><%=h @entry.title %></title>
+  <link rel="search" type="application/opensearchdescription+xml" title="<%= _('Ruby %s Reference Manual', ruby_version()) %>" href="<%=h opensearchdescription_url() %>">
 </head>
 <body>
 <p>
diff --git a/data/bitclust/template/function b/data/bitclust/template/function
index b42b2ce..9b8c0fa 100644
--- a/data/bitclust/template/function
+++ b/data/bitclust/template/function
@@ -5,6 +5,7 @@
   <meta http-equiv="Content-Language" content="ja-JP">
   <link rel="stylesheet" type="text/css" href="<%= css_url() %>">
   <title><%=h @entry.type_label %> <%=h @entry.label %></title>
+  <link rel="search" type="application/opensearchdescription+xml" title="<%= _('Ruby %s Reference Manual', ruby_version()) %>" href="<%=h opensearchdescription_url() %>">
 </head>
 <body>
 
diff --git a/data/bitclust/template/function-index b/data/bitclust/template/function-index
index cb720a8..4de467b 100644
--- a/data/bitclust/template/function-index
+++ b/data/bitclust/template/function-index
@@ -5,6 +5,7 @@
   <meta http-equiv="Content-Language" content="ja-JP">
   <link rel="stylesheet" type="text/css" href="<%=h css_url() %>">
   <title><%= _('Function Index') %></title>
+  <link rel="search" type="application/opensearchdescription+xml" title="<%= _('Ruby %s Reference Manual', ruby_version()) %>" href="<%=h opensearchdescription_url() %>">
 </head>
 <body id="functionindex">
 
diff --git a/data/bitclust/template/library b/data/bitclust/template/library
index ef3dae5..25c41d3 100644
--- a/data/bitclust/template/library
+++ b/data/bitclust/template/library
@@ -5,6 +5,7 @@
   <meta http-equiv="Content-Language" content="ja-JP">
   <link rel="stylesheet" type="text/css" href="<%=h css_url() %>">
   <title>library <%=h @entry.name %></title>
+  <link rel="search" type="application/opensearchdescription+xml" title="<%= _('Ruby %s Reference Manual', ruby_version()) %>" href="<%=h opensearchdescription_url() %>">
 </head>
 <body>
 
diff --git a/data/bitclust/template/library-index b/data/bitclust/template/library-index
index 6747282..96aa35d 100644
--- a/data/bitclust/template/library-index
+++ b/data/bitclust/template/library-index
@@ -5,6 +5,7 @@
   <meta http-equiv="Content-Language" content="ja-JP">
   <link rel="stylesheet" type="text/css" href="<%=h css_url() %>">
   <title><%= _('Library Index') %></title>
+  <link rel="search" type="application/opensearchdescription+xml" title="<%= _('Ruby %s Reference Manual', ruby_version()) %>" href="<%=h opensearchdescription_url() %>">
 </head>
 <body id="libraryindex">
 
diff --git a/data/bitclust/template/method b/data/bitclust/template/method
index 50314c3..34689f2 100644
--- a/data/bitclust/template/method
+++ b/data/bitclust/template/method
@@ -8,6 +8,7 @@
   <meta http-equiv="Content-Language" content="ja-JP">
   <link rel="stylesheet" type="text/css" href="<%= css_url() %>">
   <title><%=h entry.type_label %> <%=h entry.label %></title>
+  <link rel="search" type="application/opensearchdescription+xml" title="<%= _('Ruby %s Reference Manual', ruby_version()) %>" href="<%=h opensearchdescription_url() %>">
 </head>
 <body>
 
diff --git a/data/bitclust/template/opensearchdescription b/data/bitclust/template/opensearchdescription
new file mode 100644
index 0000000..bf7597c
--- /dev/null
+++ b/data/bitclust/template/opensearchdescription
@@ -0,0 +1,10 @@
+<?xml version="1.0"  encoding="<%=h encoding() %>"?>
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
+                       xmlns:moz="http://www.mozilla.org/2006/browser/search/">
+  <ShortName><%= _('Ruby %s Reference Manual', ruby_version()) %></ShortName>
+  <Description><%= _('Ruby %s Reference Manual', ruby_version()) %></Description>
+  <Image height="16" width="16" type="image/x-icon">http://www.ruby-lang.org/favicon.ico</Image>
+  <InputEncoding><%=h encoding() %></InputEncoding>
+  <Url type="text/html" method="get" template="<%=h search_full_url() %>?q={searchTerms}"/>
+  <moz:SearchForm><%=h search_full_url() %></moz:SearchForm>
+</OpenSearchDescription>
diff --git a/data/bitclust/template/search b/data/bitclust/template/search
index 4df6a72..8bdbee7 100644
--- a/data/bitclust/template/search
+++ b/data/bitclust/template/search
@@ -5,6 +5,7 @@
   <meta http-equiv="Content-Language" content="ja-JP">
   <link rel="stylesheet" type="text/css" href="<%=h css_url() %>">
   <title><%=h _('Search Results') %></title>
+  <link rel="search" type="application/opensearchdescription+xml" title="<%= _('Ruby %s Reference Manual', ruby_version()) %>" href="<%=h opensearchdescription_url() %>">
 </head>
 <body>
 
diff --git a/lib/bitclust/requesthandler.rb b/lib/bitclust/requesthandler.rb
index 8b9b1fc..bf8eb75 100644
--- a/lib/bitclust/requesthandler.rb
+++ b/lib/bitclust/requesthandler.rb
@@ -73,6 +73,10 @@ module BitClust
       @screenmanager.class_index_screen(@db.classes.sort, @conf).response
     end
 
+    def handle_opensearchdescription(req)
+      @screenmanager.opensearchdescription_screen(req.full_uri, @conf).response
+    end
+
     def handle_search(req)
       ret = []
       q0 = req.query['q'] || ''
@@ -188,7 +192,7 @@ module BitClust
     def defined_type?
       type, param = parse_path_info()
       case type
-      when 'library', 'class', 'method', 'function', 'search'
+      when 'library', 'class', 'method', 'function', 'search', 'opensearchdescription'
         true
       else
         false
@@ -228,6 +232,10 @@ module BitClust
       @wreq.query
     end
 
+    def full_uri
+      @wreq.request_uri
+    end
+
     private
 
     def type_param
@@ -264,6 +272,9 @@ module BitClust
       @rack_req.env["PATH_INFO"]
     end
 
+    def full_uri
+      URI.parse(@rack_req.url)
+    end
   end
 
   class Screen   # reopen
diff --git a/lib/bitclust/screen.rb b/lib/bitclust/screen.rb
index 99ab203..f2c0309 100644
--- a/lib/bitclust/screen.rb
+++ b/lib/bitclust/screen.rb
@@ -57,6 +57,10 @@ module BitClust
       new_screen(MethodScreen, ms, opt)
     end
 
+    def opensearchdescription_screen(request_full_uri, opt)
+      new_screen(OpenSearchDescriptionScreen, request_full_uri, opt)
+    end
+
     def seach_screen(result, opt)
       new_screen(SearchScreen, result, opt)
     end
@@ -127,6 +131,10 @@ module BitClust
       "#{@cgi_url}/function/#{name}"
     end
 
+    def opensearchdescription_url
+      "#{@cgi_url}/opensearchdescription"
+    end
+
     def search_url
       "#{@cgi_url}/search"
     end
@@ -244,6 +252,10 @@ module BitClust
       @urlmapper.css_url
     end
 
+    def opensearchdescription_url
+      @urlmapper.opensearchdescription_url
+    end
+
     def search_url
       @urlmapper.search_url
     end
@@ -378,6 +390,25 @@ module BitClust
     end
   end
 
+  class OpenSearchDescriptionScreen < TemplateScreen
+    def initialize(h, request_full_uri, opt)
+      h = h.dup
+      h[:database] = opt[:database]
+      super h
+      @search_full_url = (request_full_uri + search_url()).to_s
+    end
+
+    attr_reader :search_full_url
+
+    def body
+      run_template('opensearchdescription')
+    end
+
+    def content_type
+      "application/opensearchdescription+xml; charset=#{encoding()}"
+    end
+  end
+
   class SearchScreen < IndexScreen
     def initialize(h, entries, opt)
       super h, entries, opt
