Index: django/db/models/fields/related.py
===================================================================
--- django/db/models/fields/related.py	(revision 3657)
+++ django/db/models/fields/related.py	(working copy)
@@ -566,6 +566,11 @@
 
         self.db_index = True
 
+    def get_related_pk(self):
+        """ Returning the primary key of the object we are related to
+        """
+        return self.get_choices()[1][0]
+
     def get_attname(self):
         return '%s_id' % self.name
 
Index: django/contrib/admin/media/js/admin/RelatedObjectLookups.js
===================================================================
--- django/contrib/admin/media/js/admin/RelatedObjectLookups.js	(revision 3657)
+++ django/contrib/admin/media/js/admin/RelatedObjectLookups.js	(working copy)
@@ -55,3 +55,30 @@
     }
     win.close();
 }
+
+function showEditPopup(triggeringLink) {
+    var name = triggeringLink.id.replace(/^edit_/,'');
+    var elem = document.getElementById(name);
+    if (elem) {
+        if (elem.nodeName == 'SELECT') {
+            var id = elem.options[elem.selectedIndex].value
+            name = name.replace(/\./g,'___');
+            var win = window.open(triggeringLink.href + id + '/?_popup=1',name, 'height=500,width=800,resizable=yes,scrollbars=yes');
+            return false;
+        }
+    }
+    return false;
+}
+
+function dismissEditPopup(win, newId, newRepr) {
+    var name = win.name.replace(/___/g, '.');
+    var elem = document.getElementById(name);
+    if(elem) {
+        if( elem.nodeName == 'SELECT') {
+            var o = new Option(newRepr, newId);
+            elem.options[elem.selectedIndex] = o;
+            o.selected = true;
+        }
+    }
+    win.close();
+}
Index: django/contrib/admin/views/main.py
===================================================================
--- django/contrib/admin/views/main.py	(revision 3657)
+++ django/contrib/admin/views/main.py	(working copy)
@@ -130,6 +130,10 @@
 
         if field.rel:
             self.related_url = '../../../%s/%s/' % (field.rel.to._meta.app_label, field.rel.to._meta.object_name.lower())
+            try:
+                self.rel_to_pk = field.get_related_pk() # for one-to-one fields
+            except:
+                pass
 
     def original_value(self):
         if self.original:
@@ -343,6 +347,10 @@
             LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, pk_value, str(new_object), CHANGE, change_message)
 
             msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': opts.verbose_name, 'obj': new_object}
+            if request.REQUEST.has_key("_popup"):
+                http_response = '<script type="text/javascript">opener.dismissEditPopup(window, %s, "%s");</script>' % \
+                    (pk_value, str(new_object).replace('"', '\\"'))
+                return HttpResponse(http_response)
             if request.POST.has_key("_continue"):
                 request.user.message_set.create(message=msg + ' ' + _("You may edit it again below."))
                 if request.REQUEST.has_key('_popup'):
Index: django/contrib/admin/templates/widget/one_to_one.html
===================================================================
--- django/contrib/admin/templates/widget/one_to_one.html	(revision 3657)
+++ django/contrib/admin/templates/widget/one_to_one.html	(working copy)
@@ -1,2 +1,4 @@
+{% load admin_modify adminmedia %}
 {% if add %}{% include "widget/foreign.html" %}{% endif %}
-{% if change %}{% if bound_field.existing_display %}&nbsp;<strong>{{ bound_field.existing_display|truncatewords:"14"|escape }}</strong>{% endif %}{% endif %}
+{% if change %}
+{% if bound_field.rel_to_pk %}&nbsp;<a href="{{ bound_field.related_url }}{{ bound_field.rel_to_pk}}"><strong>{{ bound_field.existing_display|truncatewords:"14"|escape }}</strong></a>{% endif %}{% endif %}
Index: django/contrib/admin/templates/widget/foreign.html
===================================================================
--- django/contrib/admin/templates/widget/foreign.html	(revision 3657)
+++ django/contrib/admin/templates/widget/foreign.html	(working copy)
@@ -8,8 +8,11 @@
     {% endif %}
 {% else %}
 {% if bound_field.needs_add_label %}
-    <a href="{{ bound_field.related_url }}add/" class="add-another" id="add_{{ bound_field.element_id }}" onclick="return showAddAnotherPopup(this);"> <img src="{% admin_media_prefix %}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a>
-{% endif %}{% endif %}
+    <a href="{{ bound_field.related_url }}add/" class="add-another" id="add_{{ bound_field.element_id }}" onclick="return showAddAnotherPopup(this);"> <img src="{% admin_media_prefix %}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a> 
+    <a href="{{ bound_field.related_url }}" class="related-lookup" id="edit_{{ bound_field.element_id }}" onclick="return showEditPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a>
+ 
+{% endif %}
+{% endif %}
 {% if change %}
     {% if bound_field.field.primary_key %}
         {{ bound_field.original_value }}
