diff --git a/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/LineOverlay.h b/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/LineOverlay.h
index 900a4a2b966b2d887e6131b2ea2e7c4d55e5c57c..dec16fc0175d1ae0425a91cce94545fef4ce49fe 100644
--- a/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/LineOverlay.h
+++ b/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/LineOverlay.h
@@ -69,7 +69,7 @@ namespace SliceViewer
     double getWidth() const;
 
   signals:
-  /// Signal sent while the line is being dragged
+    /// Signal sent while the line is being dragged
     void lineChanging(QPointF, QPointF, double);
     /// Signal sent once the drag is completed
     void lineChanged(QPointF, QPointF, double);
diff --git a/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/LineViewer.h b/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/LineViewer.h
index 1fb275acb2bf54b79e747fabe9003768477eb4f3..ea2f19192341ebcd4a70848a6d1021182b85b4e3 100644
--- a/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/LineViewer.h
+++ b/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/LineViewer.h
@@ -26,12 +26,16 @@ public:
     void setStart(Mantid::Kernel::VMD start);
     void setEnd(Mantid::Kernel::VMD end);
     void setWidth(Mantid::Kernel::VMD width);
+    void setPlanarWidth(double width);
     void setNumBins(size_t numBins);
     void setFreeDimensions(bool all, int dimX, int dimY);
 
     void showPreview();
     void showFull();
 
+    double getPlanarWidth() const;
+    Mantid::Kernel::VMD getWidth() const;
+
 private:
     void createDimensionWidgets();
     void updateFreeDimensions();
@@ -49,6 +53,13 @@ public slots:
     void adaptiveBinsChanged();
     void setFreeDimensions(size_t dimX, size_t dimY);
 
+signals:
+    /// Signal emitted when the planar width changes
+    void changedPlanarWidth(double);
+    /// Signal emitted when the start or end position has changed
+    void changedStartOrEnd(Mantid::Kernel::VMD, Mantid::Kernel::VMD);
+
+
 private:
     // -------------------------- Widgets ----------------------------
 
diff --git a/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/SliceViewerWindow.h b/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/SliceViewerWindow.h
index 27ef46b5d3feae1d76b008a51f9d0ec0b782874d..2b6d2db6c317893034022cd27eac6c36fa64e0ec 100644
--- a/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/SliceViewerWindow.h
+++ b/Code/Mantid/MantidQt/SliceViewer/inc/MantidQtSliceViewer/SliceViewerWindow.h
@@ -43,6 +43,8 @@ protected slots:
   void lineChanging(QPointF start, QPointF end, double width);
   void lineChanged(QPointF start, QPointF end, double width);
   void showLineViewer(bool);
+  void changeStartOrEnd(Mantid::Kernel::VMD, Mantid::Kernel::VMD);
+  void changePlanarWidth(double);
 
 protected:
   void deleteHandle(const std::string& wsName,const boost::shared_ptr<Mantid::API::Workspace> ws);
diff --git a/Code/Mantid/MantidQt/SliceViewer/src/LineViewer.cpp b/Code/Mantid/MantidQt/SliceViewer/src/LineViewer.cpp
index 0e7e9de10dad0a45383f23a2b299739cea2b0e42..d8a6ad6e8af31b3503f9db493b5f509ea096e262 100644
--- a/Code/Mantid/MantidQt/SliceViewer/src/LineViewer.cpp
+++ b/Code/Mantid/MantidQt/SliceViewer/src/LineViewer.cpp
@@ -117,9 +117,10 @@ void LineViewer::updateFreeDimensions()
     m_endText[d]->setEnabled(b);
     // If all dims are free, width makes little sense. Only allow one (circular) width
     if (m_allDimsFree)
-      m_widthText[d]->setEnabled(d != 0);
+      m_widthText[d]->setVisible(d != 0);
     else
-      m_widthText[d]->setEnabled(!b);
+      m_widthText[d]->setVisible(!b);
+    m_widthText[d]->setToolTip("Integration width in this dimension.");
 
     // --- Adjust the signals ---
     m_startText[d]->disconnect();
@@ -139,7 +140,10 @@ void LineViewer::updateFreeDimensions()
   }
   // But enable the width setting on the free X dimension
   if (!m_allDimsFree)
-    m_widthText[m_freeDimX]->setEnabled(true);
+  {
+    m_widthText[m_freeDimX]->setVisible(true);
+    m_widthText[m_freeDimX]->setToolTip("Integration width perpendicular to the line, along the chosen plane.");
+  }
 
 }
 
@@ -194,7 +198,7 @@ void LineViewer::apply()
   bool adaptive = ui.chkAdaptiveBins->isChecked();
 
   // (half-width in the plane)
-  double planeWidth = m_width[m_freeDimX];
+  double planeWidth = this->getPlanarWidth();
   // Length of the line
   double length = (m_end - m_start).norm();
   double dx = m_end[m_freeDimX] - m_start[m_freeDimX];
@@ -293,6 +297,7 @@ void LineViewer::startLinkedToEndText()
   {
     if (d != m_freeDimX && d != m_freeDimY)
     {
+      // Copy the start text to the end text
       m_endText[d]->setText( m_startText[d]->text() );
     }
   }
@@ -309,6 +314,8 @@ void LineViewer::startEndTextEdited()
 {
   this->readTextboxes();
   this->showPreview();
+  // Send the signal that the positions changed
+  emit changedStartOrEnd(m_start, m_end);
 }
 
 /** Slot called when the width text box is edited */
@@ -317,6 +324,8 @@ void LineViewer::widthTextEdited()
   this->readTextboxes();
   //TODO: Don't always auto-apply
   this->apply();
+  // Send the signal that the width changed
+  emit changedPlanarWidth(this->getPlanarWidth());
 }
 
 /** Slot called when the number of bins changes */
@@ -334,6 +343,26 @@ void LineViewer::adaptiveBinsChanged()
   this->apply();
 }
 
+
+// ==============================================================================================
+// ================================== External Getters ==========================================
+// ==============================================================================================
+/** @return the width in the plane, or the width in dimension 0 if not restricted to a plane */
+double LineViewer::getPlanarWidth() const
+{
+  if (m_allDimsFree)
+    return m_width[0];
+  else
+    return m_width[m_freeDimX];
+}
+
+/// @return the full width vector in each dimensions
+Mantid::Kernel::VMD LineViewer::getWidth() const
+{
+  return m_width;
+}
+
+
 // ==============================================================================================
 // ================================== External Setters ==========================================
 // ==============================================================================================
@@ -344,6 +373,7 @@ void LineViewer::adaptiveBinsChanged()
 void LineViewer::setWorkspace(Mantid::API::IMDWorkspace_sptr ws)
 {
   m_ws = ws;
+  m_width = VMD(ws->getNumDims());
   createDimensionWidgets();
 }
 
@@ -379,6 +409,31 @@ void LineViewer::setWidth(Mantid::Kernel::VMD width)
   updateStartEnd();
 }
 
+/** Set the width of the line in the planar dimension only.
+ * Other dimensions' widths will follow unless they were manually changed
+ * @param width :: width in the plane. */
+void LineViewer::setPlanarWidth(double width)
+{
+  if (m_allDimsFree)
+  {
+    for (size_t d=0; d<m_width.getNumDims(); d++)
+      m_width[d] = width;
+  }
+  else
+  {
+    double oldPlanarWidth = this->getPlanarWidth();
+    for (size_t d=0; d<m_width.getNumDims(); d++)
+    {
+      // Only modify the locked onese
+      if (m_width[d] == oldPlanarWidth)
+        m_width[d] = width;
+    }
+    // And always set the one
+    m_width[m_freeDimX] = width;
+  }
+  updateStartEnd();
+}
+
 /** Set the number of bins in the line
  * @param nbins :: # of bins */
 void LineViewer::setNumBins(size_t numBins)
diff --git a/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp b/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp
index 8660a38fdf6a2befb96b79e55718538091e2f16b..1ca04072c8672d727e345707a33635ef75fdc8ef 100644
--- a/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp
+++ b/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp
@@ -694,10 +694,10 @@ void SliceViewer::changedShownDim(int index, int dim, int oldDim)
       }
     }
   }
+  // Show the new slice. This finds m_dimX and Y
+  this->updateDisplay();
   // Send out a signal
   emit changedShownDim(m_dimX, m_dimY);
-  // Show the new slice
-  this->updateDisplay();
 }
 
 
diff --git a/Code/Mantid/MantidQt/SliceViewer/src/SliceViewerWindow.cpp b/Code/Mantid/MantidQt/SliceViewer/src/SliceViewerWindow.cpp
index ef75736c6090fdde789c8871ad8c9c910086a761..b67d2941994d5f04a8bbf136d6bb0d6aec62aa9f 100644
--- a/Code/Mantid/MantidQt/SliceViewer/src/SliceViewerWindow.cpp
+++ b/Code/Mantid/MantidQt/SliceViewer/src/SliceViewerWindow.cpp
@@ -76,17 +76,23 @@ SliceViewerWindow::SliceViewerWindow(const QString& wsName, QWidget *app , const
   connect(this,SIGNAL(needToUpdate()),this,SLOT(updateWorkspace()));
 
   // Connect the SliceViewer and the LineViewer together
+  QObject::connect( m_slicer, SIGNAL(showLineViewer(bool)),
+            this, SLOT(showLineViewer(bool)) );
   QObject::connect( m_slicer, SIGNAL(changedShownDim(size_t, size_t)),
             m_liner, SLOT(setFreeDimensions(size_t, size_t)) );
   QObject::connect( m_slicer, SIGNAL(changedSlicePoint(Mantid::Kernel::VMD)),
             this, SLOT(changedSlicePoint(Mantid::Kernel::VMD)) );
+  // Drag-dropping the line around
   QObject::connect( m_slicer->getLineOverlay(), SIGNAL(lineChanging(QPointF, QPointF, double)),
             this, SLOT(lineChanging(QPointF, QPointF, double)) );
   QObject::connect( m_slicer->getLineOverlay(), SIGNAL(lineChanged(QPointF, QPointF, double)),
             this, SLOT(lineChanged(QPointF, QPointF, double)) );
-  QObject::connect( m_slicer, SIGNAL(showLineViewer(bool)),
-            this, SLOT(showLineViewer(bool)) );
-  //QObject::connect( m_slicer, SIGNAL(changedSlicePoint(size_t, size_t)), m_liner, SIGNAL(setFreeDimensions(size_t, size_t)) );
+
+  // Link back the LineViewer to the SliceViewer's line overlay.
+  QObject::connect( m_liner, SIGNAL(changedStartOrEnd(Mantid::Kernel::VMD, Mantid::Kernel::VMD)),
+            this, SLOT(changeStartOrEnd(Mantid::Kernel::VMD, Mantid::Kernel::VMD)) );
+  QObject::connect( m_liner, SIGNAL(changedPlanarWidth(double)),
+            this, SLOT(changePlanarWidth(double)) );
 
   // Set the current workspace
   this->updateWorkspace();
@@ -186,10 +192,7 @@ void SliceViewerWindow::setLineViewerValues(QPointF start2D, QPointF end2D, doub
   end[m_slicer->getDimY()] = end2D.y();
   m_liner->setStart(start);
   m_liner->setEnd(end);
-  VMD widthVec = start * 0;
-  for (size_t d=0; d<widthVec.getNumDims(); d++)
-    widthVec[d] = width;
-  m_liner->setWidth(widthVec);
+  m_liner->setPlanarWidth(width);
 }
 
 //------------------------------------------------------------------------------------------------
@@ -203,7 +206,6 @@ void SliceViewerWindow::lineChanging(QPointF start2D, QPointF end2D, double widt
 /** Slot called when the line overlay drag is released */
 void SliceViewerWindow::lineChanged(QPointF start2D, QPointF end2D, double width)
 {
-  std::cout << "SliceViewerWindow::lineChanged()\n";
   setLineViewerValues(start2D, end2D, width);
   m_liner->apply();
 }
@@ -212,10 +214,40 @@ void SliceViewerWindow::lineChanged(QPointF start2D, QPointF end2D, double width
  * (keeping the line in the same 2D point) */
 void SliceViewerWindow::changedSlicePoint(Mantid::Kernel::VMD slice)
 {
+  UNUSED_ARG(slice);
   setLineViewerValues( m_slicer->getLineOverlay()->getPointA() ,  m_slicer->getLineOverlay()->getPointB(),  m_slicer->getLineOverlay()->getWidth() );
   m_liner->showPreview();
 }
 
+/** Slot called when the user manually changes start/end points in the text box,
+ * so that the graph updates
+ * @param start :: start coordinates
+ * @param end :: end coordinates
+ */
+void SliceViewerWindow::changeStartOrEnd(Mantid::Kernel::VMD start, Mantid::Kernel::VMD end)
+{
+  QPointF start2D(start[m_slicer->getDimX()], start[m_slicer->getDimY()]);
+  QPointF end2D(end[m_slicer->getDimX()], end[m_slicer->getDimY()]);
+  m_slicer->getLineOverlay()->blockSignals(true);
+  m_slicer->getLineOverlay()->setPointA(start2D);
+  m_slicer->getLineOverlay()->setPointB(end2D);
+  m_slicer->getLineOverlay()->blockSignals(false);
+  m_slicer->getLineOverlay()->update();
+}
+
+/** Slot called when the user manually changes the width in the text box,
+ * to update the gui.
+ * @param width :: new planar width.
+ */
+void SliceViewerWindow::changePlanarWidth(double width)
+{
+  m_slicer->getLineOverlay()->blockSignals(true);
+  m_slicer->getLineOverlay()->setWidth(width);
+  m_slicer->getLineOverlay()->blockSignals(false);
+  m_slicer->getLineOverlay()->update();
+}
+
+
 //------------------------------------------------------------------------------------------------
 /** Signal to close this window if the workspace has just been deleted */
 void SliceViewerWindow::deleteHandle(const std::string& wsName,const boost::shared_ptr<Mantid::API::Workspace> ws)