diff --git a/c/Hotlist b/c/Hotlist
index ae3ea99008cbebd2a477fe8b84b1ee425ab80154..26f65b3cc7fa9682f24bd6feb81c4720f6d744a4 100644
--- a/c/Hotlist
+++ b/c/Hotlist
@@ -3296,6 +3296,15 @@ _kernel_oserror * hotlist_open(int show_type, void * type, int show_urls)
 
   /* Show the hotlist */
 
+  /* Open window once to let the wimp/toolbox see what shape it really is */
+  e = toolbox_show_object(0,
+                          hotlist_windowid,
+                          Toolbox_ShowObject_Default,
+                          0,
+                          0,
+                          0);
+
+  /* Open it once again in the place the window is really wanted */
   e = toolbox_show_object(0,
                           hotlist_windowid,
                           show_type,
@@ -4051,7 +4060,7 @@ static int hotlist_drag_completed_handler(int event_code, WimpPollBlock *event,
 
   if (!hotlist_dragging) return 0;
 
-  show_error_ret(hotlist_autoscroll(0)); /* Reset autoscrolling (To remove pointer if necessary) */
+  show_error_ret(hotlist_autoscroll(0)); /* Reset autoscrolling (To restore pointer if necessary) */
 
   switch(hotlist_dragging)
   {
@@ -4511,7 +4520,10 @@ static int hotlist_null_handler(int event_code, WimpPollBlock *event, IdBlock *i
 /* Simple non-scrolling selection box, to be improved later */
 
 /* Workarea relative corner of selection box may not be needed later */
-static int selection_x, selection_y; ////////////
+///////////////////////////////////////////////////////////////////////
+static int selection_x, selection_y;
+///////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////
 
 /*************************************************/
 /* hotlist_start_drag()                          */
@@ -5058,3 +5070,124 @@ static int hotlist_ram_fetch_handler(WimpMessage *message, void *handle)
   }
   return 0;
 }
+
+/*************************************************/
+/* hotlist_read_toolbox_id()                     */
+/*                                               */
+/* Returns:    the hotlist window toolbox id     */
+/*************************************************/
+
+ObjectId hotlist_read_toolbox_id(void)
+{
+  return hotlist_windowid;
+}
+
+/*************************************************/
+/* hotlist_add_position()                        */
+/*                                               */
+/* Add a new URL to the hotlist at a specified   */
+/* position.                                     */
+/*                                               */
+/* Parameters: screen relative x position        */
+/*                                               */
+/*             screen relative y position        */
+/*                                               */
+/*             Description of the URL (e.g. from */
+/*             the page title);                  */
+/*                                               */
+/*             Pointer to the URL itself;        */
+/*************************************************/
+
+_kernel_oserror * hotlist_add_position(int x, int y, char *description, char *url)
+{
+  _kernel_oserror *e;
+  WimpGetWindowStateBlock state;
+  int winx, winy, top, position;
+  hotlist_item * targetitem;
+  unsigned int item_height, item_dir_width, item_url_width, xmin, xmax;
+
+  /* Calculate window relative coordinates */
+  RetError(window_wimp_to_toolbox(0,
+                                  hotlist_windowid,
+                                  0,
+                                  &state.window_handle,
+                                  NULL));
+  RetError(wimp_get_window_state(&state));
+  winx = x + (state.xscroll - state.visible_area.xmin);
+  winy = y + (state.yscroll - state.visible_area.ymax);
+
+  /* Calculate which item add is over */
+  hotlist_get_entry_sizes(&item_height, &item_dir_width, &item_url_width);
+  targetitem = hotlist_find_item(hotlist_root->data.directory_content, -winy/item_height);
+  top = -winy/item_height;
+
+  /* Decide where to put the new item */
+  if (targetitem)
+  {
+    hotlist_get_shape(&xmin, &xmax, targetitem);
+    if (targetitem->type == hl_directory && winx >= xmin && winx <= xmin+item_dir_width)
+    {
+      /* Put item in directory */
+      position = HOTLIST_POSITION_BEGINNING;
+    }
+    else
+    {
+      if ((-winy % item_height) > item_height / 2)
+      {
+        /* Put item after target item */
+        position = HOTLIST_POSITION_AFTER;
+      }
+      else
+      {
+        /* Put item before target item */
+        position = HOTLIST_POSITION_BEFORE;
+      }
+    }
+  }
+  else
+  {
+    /* Put item at end of root directory */
+    position = HOTLIST_POSITION_END;
+    targetitem = hotlist_root;
+  }
+
+  /* Create new item in appropriate place */
+  e = hotlist_new_url(targetitem,
+                      position,
+                      description,
+                      url);
+
+  if (!e) hotlist_window_preopen(already_open);
+
+  /* Optimise the redraw to do as little as possible depending */
+  /* upon where in the list the item was added.                */
+
+  switch (position)
+  {
+    case HOTLIST_POSITION_END:
+    {
+      hotlist_redraw_now();
+    }
+    break;
+
+    case HOTLIST_POSITION_BEGINNING:
+    {
+      hotlist_clear_flags(hotlist_root, hl_ALL, HOTLIST_G_REDRAW_NOW);
+      hotlist_redraw_items(0,
+                           hotlist_count_displayed_items(hotlist_root->data.directory_content));
+    }
+    break;
+
+    default:
+    {
+      hotlist_clear_flags(hotlist_root, hl_ALL, HOTLIST_G_REDRAW_NOW);
+      hotlist_redraw_items(-winy/item_height - 1,
+                           hotlist_count_displayed_items(hotlist_root->data.directory_content));
+    }
+    break;
+  }
+
+  if (!e) return hotlist_modified(HL_MODIFIED_ADD);
+
+  return e;
+}
diff --git a/h/Hotlist b/h/Hotlist
index 118e41f370ad2c6cb74b9f0e6614f79c30a7bb3c..639bf243f678d2d3c72d0ac5637238975fc60502 100644
--- a/h/Hotlist
+++ b/h/Hotlist
@@ -205,14 +205,17 @@
 
   /* Function prototypes */
 
-  _kernel_oserror * hotlist_initialise (void);
+  _kernel_oserror * hotlist_initialise   (void);
 
-  _kernel_oserror * hotlist_open       (int show_type, void * type, int show_urls);
-  _kernel_oserror * hotlist_close      (void);
+  _kernel_oserror * hotlist_open            (int show_type, void * type, int show_urls);
+  _kernel_oserror * hotlist_close           (void);
+  ObjectId          hotlist_read_toolbox_id (void);
 
-  _kernel_oserror * hotlist_load       (char * filename);
-  _kernel_oserror * hotlist_save       (char * filename);
+  _kernel_oserror * hotlist_load         (char * filename);
+  _kernel_oserror * hotlist_save         (char * filename);
+
+  _kernel_oserror * hotlist_add          (char * description, char * url, int at_bottom);
+  _kernel_oserror * hotlist_add_position (int x, int y, char * description, char * url);
 
-  _kernel_oserror * hotlist_add        (char * description, char * url, int at_bottom);
 
 #endif