diff --git a/deluge/core/core.py b/deluge/core/core.py
index 1eb80eb..73de401 100644
--- a/deluge/core/core.py
+++ b/deluge/core/core.py
@@ -382,6 +382,20 @@ def connect_peer(self, torrent_id, ip, port):
             log.warning("Error adding peer %s:%s to %s", ip, port, torrent_id)
 
     @export
+    def add_url_seed(self, torrent_id, url):
+        log.debug("adding torrent url %s" % url)
+        self.torrentmanager[torrent_id].add_url_seed(url)
+
+    @export
+    def remove_url_seed(self, torrent_id, url):
+        log.debug("removing torrent url %s" % url)
+        self.torrentmanager[torrent_id].remove_url_seed(url)
+
+    @export
+    def url_seeds(self, torrent_id):
+        return self.torrrentmanager[torrent_id].url_seeds()
+
+    @export
     def move_storage(self, torrent_ids, dest):
         log.debug("Moving storage %s to %s", torrent_ids, dest)
         for torrent_id in torrent_ids:
diff --git a/deluge/core/torrent.py b/deluge/core/torrent.py
index 5e8c26e..9b8fee9 100644
--- a/deluge/core/torrent.py
+++ b/deluge/core/torrent.py
@@ -829,6 +829,34 @@ def connect_peer(self, ip, port):
             return False
         return True
 
+    def add_url_seed(self, url):
+        """
+        add manual webseed
+        url is assumed correctly formatted and valid
+        
+        follows libtorrent bep 19
+        http://www.rasterbar.com/products/libtorrent/manual.html#http-seeding
+        """
+        try:
+            self.handle.add_url_seed(url)
+        except:
+            log.debug("Unable to add webseed")
+
+    def remove_url_seed(self, url):
+        """
+        remove a webseed if it exists
+        url is assumed correct
+        
+        webseeds may automatically be removed by libtorrent if they are invalid or fail
+        """
+    	self.handle.remove_url_seed(url)
+
+    def url_seeds(self):
+        """
+        returns a list of webseeds
+        """
+        return self.handle.url_seeds()
+
     def move_storage(self, dest):
         """Move a torrent's storage location"""
 
diff --git a/deluge/ui/gtkui/glade/dgtkpopups.glade b/deluge/ui/gtkui/glade/dgtkpopups.glade
index 68f2c4b..8796b35 100644
--- a/deluge/ui/gtkui/glade/dgtkpopups.glade
+++ b/deluge/ui/gtkui/glade/dgtkpopups.glade
@@ -260,4 +260,117 @@
       </widget>
     </child>
   </widget>
+  
+  <widget class="GtkDialog" id="add_webseed_dialog">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Add Webseed</property>
+    <property name="window_position">GTK_WIN_POS_MOUSE</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="skip_pager_hint">True</property>
+    <property name="decorated">False</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="dialog-vbox3">
+        <property name="visible">True</property>
+        <property name="spacing">2</property>
+        <child>
+          <widget class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="spacing">2</property>
+            <child>
+              <widget class="GtkHBox" id="hbox1">
+                <property name="visible">True</property>
+                <property name="spacing">5</property>
+                <child>
+                  <widget class="GtkImage" id="image1">
+                    <property name="visible">True</property>
+                    <property name="stock">gtk-add</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label1">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Add Webseed&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </widget>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkHSeparator" id="hseparator1">
+                <property name="visible">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkEntry" id="webseed_address">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="activates_default">True</property>
+                <property name="width_chars">39</property>
+                <property name="text" translatable="yes">http://</property>
+              </widget>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="dialog-action_area3">
+            <property name="visible">True</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <widget class="GtkButton" id="button2">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label">gtk-cancel</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">0</property>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkButton" id="button1">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label">gtk-ok</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">1</property>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  
 </glade-interface>
diff --git a/deluge/ui/gtkui/glade/main_window.glade b/deluge/ui/gtkui/glade/main_window.glade
index d575269..6b1baf4 100644
--- a/deluge/ui/gtkui/glade/main_window.glade
+++ b/deluge/ui/gtkui/glade/main_window.glade
@@ -2716,5 +2716,22 @@
         </child>
       </widget>
     </child>
+    <child>
+      <widget class="GtkImageMenuItem" id="menuitem4">
+        <property name="label" translatable="yes">_Add Webseed</property>
+        <property name="visible">True</property>
+        <property name="tooltip" translatable="yes">Add a webseed</property>
+        <property name="use_underline">True</property>
+        <property name="use_stock">False</property>
+        <signal name="activate" handler="on_menuitem_add_webseed_activate"/>
+        <child internal-child="image">
+          <widget class="GtkImage" id="image1">
+            <property name="visible">True</property>
+            <property name="stock">gtk-add</property>
+            <property name="icon-size">1</property>
+          </widget>
+        </child>
+      </widget>
+    </child>
   </widget>
 </glade-interface>
diff --git a/deluge/ui/gtkui/peers_tab.py b/deluge/ui/gtkui/peers_tab.py
index bb2316f..27876f4 100644
--- a/deluge/ui/gtkui/peers_tab.py
+++ b/deluge/ui/gtkui/peers_tab.py
@@ -67,6 +67,7 @@ def __init__(self):
         self.peer_menu = glade.get_widget("menu_peer_tab")
         glade.signal_autoconnect({
             "on_menuitem_add_peer_activate": self._on_menuitem_add_peer_activate,
+            "on_menuitem_add_webseed_activate": self._on_menuitem_add_webseed_activate,
             })
 
         self.listview = glade.get_widget("peers_listview")
@@ -399,3 +400,18 @@ def _on_menuitem_add_peer_activate(self, menuitem):
                 client.core.connect_peer(self.torrent_id, ip, port)
         peer_dialog.destroy()
         return True
+
+    def _on_menuitem_add_webseed_activate(self, menuitem):
+        """This is a callback for manually adding a webseed"""
+        log.debug("on_menuitem_add_webseed")
+        dialog_glade = gtk.glade.XML(
+            pkg_resources.resource_filename("deluge.ui.gtkui",
+                "glade/dgtkpopups.glade"))
+        add_webseed_dialog = dialog_glade.get_widget("add_webseed_dialog")
+        address = dialog_glade.get_widget("webseed_address")
+        response = add_webseed_dialog.run()
+        if response:
+            client.core.add_url_seed(self.torrent_id, address.get_text())
+        #else the user clicked cancel
+        add_webseed_dialog.destroy()
+        return True
