Index: src/layout/basicspringembedderlayout.cc
===================================================================
--- src/layout/basicspringembedderlayout.cc	(revision 6116)
+++ src/layout/basicspringembedderlayout.cc	(working copy)
@@ -259,7 +259,8 @@
     // scale back if too big -- BUT only if we don't have any fixed (or anchored) nodes,
     // because we don't want to change explicitly given coordinates (or distances
     // between anchored nodes)
-    if (sizingMode==Scale && !haveFixedNode)
+//    if (sizingMode==Scale && !haveFixedNode)
+    if (sizingMode==Scale)
     {
         // calculate bounding box
         double x1, y1, x2, y2;
@@ -276,8 +277,9 @@
         }
 
         double bx = border, by = border;
-        if (!haveAnchoredNode)
-        {
+//        if (!haveAnchoredNode)
+        if (true)
+          {
             // rescale
             double xfact = (width-2*border) / (x2-x1);
             double yfact = (height-2*border) / (y2-y1);
@@ -286,6 +288,9 @@
             for (NodeList::iterator j=nodes.begin(); j!=nodes.end(); ++j)
             {
                 Node& n = *(*j);
+                if (n.anchor || n.fixed) {
+                    continue;
+                }
                 n.x = bx + (n.x-x1)*xfact;
                 n.y = by + (n.y-y1)*yfact;
             }
Index: src/tkenv/statinsp.h
===================================================================
--- src/tkenv/statinsp.h	(revision 6116)
+++ src/tkenv/statinsp.h	(working copy)
@@ -77,7 +77,7 @@
       simtime_t moving_tline;   // t position of moving axis
 
    public:
-      TOutVectorWindow(cObject *obj,int typ,const char *geom,void *dat=NULL, int size=100);
+      TOutVectorWindow(cObject *obj,int typ,const char *geom,void *dat=NULL, int size=1500);
       ~TOutVectorWindow();
       virtual void createWindow();
       virtual void update();
Index: src/tkenv/modinsp2.tcl
===================================================================
--- src/tkenv/modinsp2.tcl	(revision 6116)
+++ src/tkenv/modinsp2.tcl	(working copy)
@@ -155,6 +155,14 @@
    return $coords
 }
 
+# get_zoomfactor --
+#
+# This function is invoked from TGraphicalModWindow::refreshLayout()
+#
+proc get_zoomfactor {c} {
+   global inspectordata
+   return $inspectordata($c:zoomfactor)
+}
 
 # draw_submod --
 #
Index: src/tkenv/modinsp.cc
===================================================================
--- src/tkenv/modinsp.cc	(revision 6116)
+++ src/tkenv/modinsp.cc	(working copy)
@@ -498,9 +498,25 @@
         environment.setCanvas(canvas);
     layouter->setEnvironment(&environment);
 
+    // get canvas size and zoom factor
+    // FIXME: Probably a single interpreter call would be more efficient
+    CHK(Tcl_VarEval(interp, "winfo width ",canvas, NULL));
+    int canvaswidth = atoi( Tcl_GetStringResult(interp) );
+    CHK(Tcl_VarEval(interp, "winfo height ", canvas, NULL));
+    int canvasheight = atoi( Tcl_GetStringResult(interp) );
+    CHK(Tcl_VarEval(interp, "get_zoomfactor ", canvas));
+    double zoomfactor = atof( Tcl_GetStringResult(interp) );
+
+    canvaswidth = (canvaswidth / zoomfactor) - 25;
+    canvasheight = (canvasheight / zoomfactor) - 25;
+
+    canvaswidth = (canvaswidth < 50 ? 50 : canvaswidth);
+    canvasheight = (canvasheight < 50 ? 50 : canvasheight);
+
     // size
-    int sx = resolveLongDispStrArg(ds.getTagArg("bgb",0), parentmodule, 740);
-    int sy = resolveLongDispStrArg(ds.getTagArg("bgb",1), parentmodule, 500);
+    int sx = resolveLongDispStrArg(ds.getTagArg("bgb",0), parentmodule, canvaswidth);
+    int sy = resolveLongDispStrArg(ds.getTagArg("bgb",1), parentmodule, canvasheight);
+
     layouter->setScaleToArea(sx,sy,50); // FIXME position "bgp" is ignored here...
 
     // loop through all submodules, get their sizes and positions and feed them into layouting engine
