Index: /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/Beam.java
===================================================================
--- /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/Beam.java	(revision 32108)
+++ /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/Beam.java	(revision 32109)
@@ -6,10 +6,32 @@
 public class Beam
 {
-    public Beam(double width, CorridorPart.ReachableSide defaultSide)
-    {
+    public Beam(Vector<Double> blueprint, double blueprintOffset, CorridorPart.ReachableSide defaultSide)
+    {
+	offset = blueprintOffset;
 	parts = new Vector<CorridorPart>();
 	
-	setDefaultSide_(defaultSide);	
-	addCorridorPart_(true, width);
+	setDefaultSide_(defaultSide);
+	if (defaultSide == CorridorPart.ReachableSide.RIGHT)
+	{
+	    for (int i = 1; i < blueprint.size(); i += 2)
+	    {
+		addCorridorPart_(true, CorridorPart.Type.WALL,
+		    blueprint.elementAt(i).doubleValue() - blueprint.elementAt(i-1).doubleValue());
+		if (i+1 < blueprint.size())
+		    addCorridorPart_(true, CorridorPart.Type.VOID,
+			blueprint.elementAt(i+1).doubleValue() - blueprint.elementAt(i).doubleValue());
+	    }
+	}
+	else
+	{
+	    for (int i = 1; i < blueprint.size(); i += 2)
+	    {
+		addCorridorPart_(true, CorridorPart.Type.PASSAGE,
+		    blueprint.elementAt(i).doubleValue() - blueprint.elementAt(i-1).doubleValue());
+		if (i+1 < blueprint.size())
+		    addCorridorPart_(true, CorridorPart.Type.VOID,
+			blueprint.elementAt(i+1).doubleValue() - blueprint.elementAt(i).doubleValue());
+	    }
+	}
 	adjustStripCache();
     }
@@ -19,6 +41,4 @@
     {
 	this.defaultSide = defaultSide;
-	defaultType = defaultSide == CorridorPart.ReachableSide.RIGHT ?
-	    CorridorPart.Type.WALL : CorridorPart.Type.PASSAGE;
     }
     
@@ -34,7 +54,18 @@
 	return parts;
     }
-
-    
-    private void addCorridorPart_(boolean append, double width)
+    
+    
+    public double getBeamOffset()
+    {
+	return offset;
+    }
+    
+    public void setBeamOffset(double beamOffset)
+    {
+	offset = beamOffset;
+    }
+
+    
+    private void addCorridorPart_(boolean append, CorridorPart.Type type, double width)
     {
 	CorridorPart.ReachableSide side = defaultSide == CorridorPart.ReachableSide.RIGHT ?
@@ -42,12 +73,14 @@
 	    
 	if (append)
-	    parts.add(new CorridorPart(width, defaultType, side));
-	else
-	    parts.add(0, new CorridorPart(width, defaultType, side));
+	    parts.add(new CorridorPart(width, type, side));
+	else
+	    parts.add(0, new CorridorPart(width, type, side));
     }
 
     public void addCorridorPart(boolean append, double width)
     {
-	addCorridorPart_(append, width);
+	addCorridorPart_(append,
+	    defaultSide == CorridorPart.ReachableSide.RIGHT ? CorridorPart.Type.WALL : CorridorPart.Type.PASSAGE,
+	    width);
 	adjustStripCache();
     }
@@ -177,4 +210,5 @@
     
     
+    private double offset;
     private Vector<CorridorPart> parts;
     private Vector<StripPosition> lhsStrips;
@@ -314,5 +348,4 @@
     
     
-    private CorridorPart.Type defaultType;
     private CorridorPart.ReachableSide defaultSide;
 }
Index: /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/BeamGeography.java
===================================================================
--- /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/BeamGeography.java	(revision 32108)
+++ /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/BeamGeography.java	(revision 32109)
@@ -46,10 +46,11 @@
 
     
-    public void adjustNodes(LatLon pivot, Vector<CorridorPart> parts)
+    public void adjustNodes(LatLon pivot, Vector<CorridorPart> parts, double beamOffset)
     {
+	double offset = -beamOffset;
 	this.parts = parts;
-	adjustNode(0, new LatLon(pivot.lat(), pivot.lon()));
+	
+	adjustNode(0, new LatLon(addMetersToLat(pivot, offset), pivot.lon()));
     
-	double offset = 0;
 	for (int i = 0; i < parts.size(); ++i)
 	{
Index: /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/IndoorSweeplineController.java
===================================================================
--- /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/IndoorSweeplineController.java	(revision 32108)
+++ /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/IndoorSweeplineController.java	(revision 32109)
@@ -73,4 +73,14 @@
     }
     
+    public double getBeamOffset(int index)
+    {
+	return model.getBeamOffset(index);
+    }
+    
+    public void setBeamOffset(int index, double beamOffset)
+    {
+	model.setBeamOffset(index, beamOffset);
+    }
+    
     public List<CorridorPart> getBeamParts(int index)
     {
Index: /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/IndoorSweeplineModel.java
===================================================================
--- /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/IndoorSweeplineModel.java	(revision 32108)
+++ /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/IndoorSweeplineModel.java	(revision 32109)
@@ -11,6 +11,4 @@
 
 /* TODO:
-- offset
-- replicate last stopline
 - focus to useful table entry after cell edit
 - keyboard shortcuts
@@ -63,6 +61,15 @@
 	for (int i = 0; i < strips.size(); ++i)
 	    offset += strips.elementAt(i).width;
-	    
-	beams.add(new Beam(width, side));
+	
+	if (strips.size() == 0)
+	{
+	    Vector<Double> blueprint = new Vector<Double>();
+	    blueprint.addElement(0.);
+	    blueprint.addElement(10.);
+	    beams.add(new Beam(blueprint, 0., side));
+	}
+	else
+	    beams.add(new Beam(strips.elementAt(strips.size()-1).lhs,
+		beams.elementAt(beams.size()-1).getBeamOffset(), side));
 	
 	if (strips.size() > 0)
@@ -128,4 +135,16 @@
 	strips.elementAt(index / 2).width = value;
 	
+	updateOsmModel();
+    }
+    
+    
+    public double getBeamOffset(int index)
+    {
+	return beams.elementAt(index / 2).getBeamOffset();
+    }
+    
+    public void setBeamOffset(int index, double beamOffset)
+    {
+	beams.elementAt(index / 2).setBeamOffset(beamOffset);	    
 	updateOsmModel();
     }
Index: /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/IndoorSweeplineWizardDialog.java
===================================================================
--- /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/IndoorSweeplineWizardDialog.java	(revision 32108)
+++ /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/IndoorSweeplineWizardDialog.java	(revision 32109)
@@ -54,5 +54,5 @@
 	panel.add(new JButton(next), 2, 2, 2, 1);
 
-	panel.add(new JLabel(tr("Strip width:")), 0, 3, 3, 1);
+	panel.add(makeWidthLabel(), 0, 3, 3, 1);
 	panel.add(makeWidthField(), 3, 3, 1, 1);
 
@@ -85,9 +85,14 @@
 	try
 	{
-	    stripWidth.setEditable(beamIndex % 2 == 1);
 	    if (beamIndex % 2 == 0)
-		stripWidth.setText("---");
+	    {
+		widthOffsetLabel.setText("Offset into background:");
+		stripWidth.setText(Double.toString(controller.getBeamOffset(beamIndex)));
+	    }
 	    else
+	    {
+		widthOffsetLabel.setText("Strip width:");
 		stripWidth.setText(Double.toString(controller.getStripWidth(beamIndex)));
+	    }
 	}
 	catch (IllegalStateException ex)
@@ -364,4 +369,13 @@
     
     
+    private JLabel widthOffsetLabel;
+    
+    private JLabel makeWidthLabel()
+    {
+	widthOffsetLabel = new JLabel(tr("Offset into background:"));
+	return widthOffsetLabel;
+    }
+    
+    
     private JTextField stripWidth;
     
@@ -399,5 +413,7 @@
 	    try
 	    {
-		if (beamIndex % 2 == 1)
+		if (beamIndex % 2 == 0)
+		    controller.setBeamOffset(beamIndex, Double.parseDouble(stripWidth.getText()));
+		else
 		    controller.setStripWidth(beamIndex, Double.parseDouble(stripWidth.getText()));
 	    }
Index: /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/ModelGeography.java
===================================================================
--- /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/ModelGeography.java	(revision 32108)
+++ /applications/editors/josm/plugins/indoor_sweepline/src/indoor_sweepline/ModelGeography.java	(revision 32109)
@@ -76,5 +76,5 @@
 		beamsGeography.setElementAt(new BeamGeography(dataSet, this), i);
 	    beamsGeography.elementAt(i).adjustNodes(new LatLon(center.lat(), addMetersToLon(center, offset)),
-		beams.elementAt(i).getBeamParts());
+		beams.elementAt(i).getBeamParts(), beams.elementAt(i).getBeamOffset());
 		
 	    if (i < strips.size())
