diff --git a/Framework/Crystal/inc/MantidCrystal/LoadIsawPeaks.h b/Framework/Crystal/inc/MantidCrystal/LoadIsawPeaks.h
index 1ecb3c3c954cc50d4c6bdf35e63a4a2d53148943..4ea4de97af84216aba5933991197e191cddabec1 100644
--- a/Framework/Crystal/inc/MantidCrystal/LoadIsawPeaks.h
+++ b/Framework/Crystal/inc/MantidCrystal/LoadIsawPeaks.h
@@ -59,7 +59,7 @@ private:
   /// Read a single peak from peaks file
   DataObjects::Peak readPeak(DataObjects::PeaksWorkspace_sptr outWS,
                              std::string &lastStr, std::ifstream &in,
-                             int &seqNum, std::string bankName);
+                             int &seqNum, std::string bankName, double qSign);
 
   int findPixelID(Geometry::Instrument_const_sptr inst, std::string bankName,
                   int col, int row);
diff --git a/Framework/Crystal/src/LoadHKL.cpp b/Framework/Crystal/src/LoadHKL.cpp
index 2e00456ddb22559d7420796bdd0c2bfc9aa1078e..dae696eaf2b2ea5121264d4f76884f85320e94c7 100644
--- a/Framework/Crystal/src/LoadHKL.cpp
+++ b/Framework/Crystal/src/LoadHKL.cpp
@@ -60,6 +60,10 @@ void LoadHKL::exec() {
   //    % (H, K, L, FSQ, SIGFSQ, hstnum, WL, TBAR, CURHST, SEQNUM, TRANSMISSION,
   //    DN, TWOTH, DSP))
   // HKL is flipped by -1 due to different q convention in ISAW vs mantid.
+  // Default for kf-ki has -q
+  double qSign = -1.0;
+  std::string convention = ConfigService::Instance().getString("default.convention");
+  if (convention == "Crystallography") qSign = 1.0;
   Instrument_sptr inst(new Geometry::Instrument);
   Detector *detector = new Detector("det1", -1, 0);
   detector->setPos(0.0, 0.0, 0.0);
@@ -107,7 +111,7 @@ void LoadHKL::exec() {
     }
 
     Peak peak(inst, scattering, wl);
-    peak.setHKL(-h, -k, -l);
+    peak.setHKL(qSign *h, qSign *k, qSign * l);
     peak.setIntensity(Inti);
     peak.setSigmaIntensity(SigI);
     peak.setRunNumber(run);
diff --git a/Framework/Crystal/src/LoadIsawPeaks.cpp b/Framework/Crystal/src/LoadIsawPeaks.cpp
index 3073c3dc8aba4298ab4d83918d6749b2ceb1caf3..f844eda828604216b60c3e47396fce411431e1de 100644
--- a/Framework/Crystal/src/LoadIsawPeaks.cpp
+++ b/Framework/Crystal/src/LoadIsawPeaks.cpp
@@ -335,7 +335,7 @@ std::string LoadIsawPeaks::readHeader(PeaksWorkspace_sptr outWS,
 DataObjects::Peak LoadIsawPeaks::readPeak(PeaksWorkspace_sptr outWS,
                                           std::string &lastStr,
                                           std::ifstream &in, int &seqNum,
-                                          std::string bankName) {
+                                          std::string bankName, double qSign) {
   double h;
   double k;
   double l;
@@ -408,8 +408,7 @@ DataObjects::Peak LoadIsawPeaks::readPeak(PeaksWorkspace_sptr outWS,
 
   // Create the peak object
   Peak peak(outWS->getInstrument(), pixelID, wl);
-  // HKL's are flipped by -1 because of the internal Q convention
-  peak.setHKL(-h, -k, -l);
+  peak.setHKL(qSign * h, qSign * k, qSign * l);
   peak.setIntensity(Inti);
   peak.setSigmaIntensity(SigI);
   peak.setBinCount(IPK);
@@ -506,7 +505,11 @@ std::string LoadIsawPeaks::readPeakBlockHeader(std::string lastStr,
  */
 void LoadIsawPeaks::appendFile(PeaksWorkspace_sptr outWS,
                                std::string filename) {
-
+  // HKL's are flipped by -1 because of the internal Q convention
+  // unless Crystallography convention
+  double qSign = -1.0;
+  std::string convention = ConfigService::Instance().getString("default.convention");
+  if (convention == "Crystallography") qSign = 1.0;
   // Open the file
   std::ifstream in(filename.c_str());
 
@@ -566,7 +569,7 @@ void LoadIsawPeaks::appendFile(PeaksWorkspace_sptr outWS,
 
     try {
       // Read the peak
-      Peak peak = readPeak(outWS, s, in, seqNum, bankName);
+      Peak peak = readPeak(outWS, s, in, seqNum, bankName, qSign);
 
       // Get the calculated goniometer matrix
       Matrix<double> gonMat = uniGonio.getR();
diff --git a/Framework/Crystal/src/SaveHKL.cpp b/Framework/Crystal/src/SaveHKL.cpp
index 0892660f75417fbe9b98815157a12693a1a32eba..31198850b53b6c0cfc0e57eb92cf30b9cb35758f 100644
--- a/Framework/Crystal/src/SaveHKL.cpp
+++ b/Framework/Crystal/src/SaveHKL.cpp
@@ -128,6 +128,11 @@ void SaveHKL::exec() {
   int runSequence = 0;
   int bankold = -1;
   int runold = -1;
+  // HKL is flipped by -1 due to different q convention in ISAW vs mantid.
+  // Default for kf-ki has -q
+  double qSign = -1.0;
+  std::string convention = ConfigService::Instance().getString("default.convention");
+  if (convention == "Crystallography") qSign = 1.0;
 
   std::fstream out;
   bool append = getProperty("AppendFile");
@@ -310,14 +315,13 @@ void SaveHKL::exec() {
     // hklFile.write('%4d%4d%4d%8.2f%8.2f%4d%8.4f%7.4f%7d%7d%7.4f%4d%9.5f%9.4f\n'
     //    % (H, K, L, FSQ, SIGFSQ, hstnum, WL, TBAR, CURHST, SEQNUM,
     //    TRANSMISSION, DN, TWOTH, DSP))
-    // HKL is flipped by -1 due to different q convention in ISAW vs mantid.
     if (p.getH() == 0 && p.getK() == 0 && p.getL() == 0) {
       banned.push_back(wi);
       continue;
     }
     if (decimalHKL == EMPTY_INT())
-      out << std::setw(4) << Utils::round(-p.getH()) << std::setw(4)
-          << Utils::round(-p.getK()) << std::setw(4) << Utils::round(-p.getL());
+      out << std::setw(4) << Utils::round(qSign *p.getH()) << std::setw(4)
+          << Utils::round(qSign *p.getK()) << std::setw(4) << Utils::round(qSign *p.getL());
     else
       out << std::setw(5 + decimalHKL) << std::fixed
           << std::setprecision(decimalHKL) << -p.getH()
diff --git a/Framework/Crystal/src/SaveIsawPeaks.cpp b/Framework/Crystal/src/SaveIsawPeaks.cpp
index eb5403151890cc03f04798f5d73f622bbd9e0d42..9d19b56bd04c6a404100f178f8e39469e11981b7 100644
--- a/Framework/Crystal/src/SaveIsawPeaks.cpp
+++ b/Framework/Crystal/src/SaveIsawPeaks.cpp
@@ -246,7 +246,11 @@ void SaveIsawPeaks::exec() {
       }
     }
   }
-
+  // HKL's are flipped by -1 because of the internal Q convention
+   // unless Crystallography convention
+   double qSign = -1.0;
+   std::string convention = ConfigService::Instance().getString("default.convention");
+   if (convention == "Crystallography") qSign = 1.0;
   // ============================== Save all Peaks
   // =========================================
   // Sequence number
@@ -304,11 +308,11 @@ void SaveIsawPeaks::exec() {
           // Sequence (run) number
           out << "3" << std::setw(7) << seqNum;
 
-          // HKL is flipped by -1 due to different q convention in ISAW vs
-          // mantid.
-          out << std::setw(5) << Utils::round(-p.getH()) << std::setw(5)
-              << Utils::round(-p.getK()) << std::setw(5)
-              << Utils::round(-p.getL());
+          // HKL's are flipped by -1 because of the internal Q convention
+           // unless Crystallography convention
+          out << std::setw(5) << Utils::round(qSign *p.getH()) << std::setw(5)
+              << Utils::round(qSign *p.getK()) << std::setw(5)
+              << Utils::round(qSign *p.getL());
 
           // Row/column
           out << std::setw(8) << std::fixed << std::setprecision(2)
diff --git a/Framework/Crystal/src/SaveLauenorm.cpp b/Framework/Crystal/src/SaveLauenorm.cpp
index 339c05f661de42f35bec75af98fde98ee01a4000..2f74efad9113a0a1193401b6959446e94e609d6d 100644
--- a/Framework/Crystal/src/SaveLauenorm.cpp
+++ b/Framework/Crystal/src/SaveLauenorm.cpp
@@ -111,6 +111,11 @@ void SaveLauenorm::exec() {
 
   // ============================== Save all Peaks
   // =========================================
+  // HKL is flipped by -1 due to different q convention in ISAW vs mantid.
+  // Default for kf-ki has -q
+  double qSign = -1.0;
+  std::string convention = ConfigService::Instance().getString("default.convention");
+  if (convention == "Crystallography") qSign = 1.0;
 
   // Go through each peak at this run / bank
   for (int wi = 0; wi < ws->getNumberPeaks(); wi++) {
@@ -170,10 +175,11 @@ void SaveLauenorm::exec() {
     // h k l lambda theta intensity and  sig(intensity)  in format
     // (3I5,2F10.5,2I10)
     // HKL is flipped by -1 due to different q convention in ISAW vs mantid.
+    // unless Crystallography convention
     if (p.getH() == 0 && p.getK() == 0 && p.getL() == 0)
       continue;
-    out << std::setw(5) << Utils::round(-p.getH()) << std::setw(5)
-        << Utils::round(-p.getK()) << std::setw(5) << Utils::round(-p.getL());
+    out << std::setw(5) << Utils::round(qSign * p.getH()) << std::setw(5)
+        << Utils::round(qSign * p.getK()) << std::setw(5) << Utils::round(qSign * p.getL());
     out << std::setw(10) << std::fixed << std::setprecision(5) << lambda;
     // Assume that want theta not two-theta
     out << std::setw(10) << std::fixed << std::setprecision(5)
diff --git a/Framework/DataHandling/src/LoadNexusProcessed.cpp b/Framework/DataHandling/src/LoadNexusProcessed.cpp
index c59b6fb24f441e29db68c3c3b1a4768f1842772d..955c0f690625ab6e4596cb5258d4f8f7a4c607c9 100644
--- a/Framework/DataHandling/src/LoadNexusProcessed.cpp
+++ b/Framework/DataHandling/src/LoadNexusProcessed.cpp
@@ -1074,6 +1074,12 @@ API::Workspace_sptr LoadNexusProcessed::loadPeaksEntry(NXEntry &entry) {
   // peaks_workspace
   m_cppFile->closeGroup();
 
+  // HKL is flipped by -1 due to different q convention in Crystallography.
+  // Always write out in ki-kf so consistent with old files
+  double qSign = 1.0;
+  std::string convention = ConfigService::Instance().getString("default.convention");
+  if (convention == "Crystallography") qSign = -1.0;
+
   for (int r = 0; r < numberPeaks; r++) {
     Kernel::V3D v3d;
     v3d[2] = 1.0;
@@ -1100,7 +1106,7 @@ API::Workspace_sptr LoadNexusProcessed::loadPeaksEntry(NXEntry &entry) {
       nxDouble.load();
 
       for (int r = 0; r < numberPeaks; r++) {
-        double val = nxDouble[r];
+        double val = qSign *nxDouble[r];
         peakWS->getPeak(r).setH(val);
       }
     }
@@ -1110,7 +1116,7 @@ API::Workspace_sptr LoadNexusProcessed::loadPeaksEntry(NXEntry &entry) {
       nxDouble.load();
 
       for (int r = 0; r < numberPeaks; r++) {
-        double val = nxDouble[r];
+        double val = qSign *nxDouble[r];
         peakWS->getPeak(r).setK(val);
       }
     }
@@ -1120,7 +1126,7 @@ API::Workspace_sptr LoadNexusProcessed::loadPeaksEntry(NXEntry &entry) {
       nxDouble.load();
 
       for (int r = 0; r < numberPeaks; r++) {
-        double val = nxDouble[r];
+        double val = qSign *nxDouble[r];
         peakWS->getPeak(r).setL(val);
       }
     }
diff --git a/Framework/DataObjects/src/Peak.cpp b/Framework/DataObjects/src/Peak.cpp
index 54383a765a42355701912d6076629669850dcf0b..61928c9b8667212f1033a6a43ee94f884642f1bb 100644
--- a/Framework/DataObjects/src/Peak.cpp
+++ b/Framework/DataObjects/src/Peak.cpp
@@ -3,6 +3,7 @@
 #include "MantidGeometry/Instrument/RectangularDetector.h"
 #include "MantidGeometry/Instrument/ReferenceFrame.h"
 #include "MantidGeometry/Objects/InstrumentRayTracer.h"
+#include "MantidKernel/ConfigService.h"
 #include "MantidKernel/Strings.h"
 #include "MantidKernel/System.h"
 #include <algorithm>
@@ -452,7 +453,11 @@ Mantid::Kernel::V3D Peak::getQLabFrame() const {
   // Now calculate the wavevector of the scattered neutron
   double wvf = (2.0 * M_PI) / this->getWavelength();
   // And Q in the lab frame
-  return (beamDir * wvi - detDir * wvf) * -1.0;
+  // Default for ki-kf is positive
+  double qSign = 1.0;
+  std::string convention = ConfigService::Instance().getString("default.convention");
+  if (convention == "Crystallography") qSign = -1.0;
+  return (beamDir * wvi - detDir * wvf) * qSign;
 }
 
 //----------------------------------------------------------------------------------------------
@@ -528,7 +533,7 @@ void Peak::setQLabFrame(Mantid::Kernel::V3D QLabFrame,
   boost::shared_ptr<const ReferenceFrame> refFrame =
       this->m_inst->getReferenceFrame();
   const V3D refBeamDir = refFrame->vecPointingAlongBeam();
-  const double qBeam = std::fabs(q.scalar_prod(refBeamDir));
+  const double qBeam = fabs(q.scalar_prod(refBeamDir));
 
   if (norm_q == 0.0)
     throw std::invalid_argument("Peak::setQLabFrame(): Q cannot be 0,0,0.");
@@ -548,7 +553,12 @@ void Peak::setQLabFrame(Mantid::Kernel::V3D QLabFrame,
   // Save the wavelength
   this->setWavelength(wl);
 
-  V3D detectorDir = q; // * -1.0;
+  // Default for ki-kf has -q
+  double qSign = -1.0;
+  std::string convention = ConfigService::Instance().getString("default.convention");
+  if (convention == "Crystallography") qSign = 1.0;
+
+  V3D detectorDir = q * qSign;
   detectorDir[refFrame->pointingAlongBeam()] = one_over_wl - qBeam;
   detectorDir.normalize();
 
diff --git a/Framework/DataObjects/src/PeaksWorkspace.cpp b/Framework/DataObjects/src/PeaksWorkspace.cpp
index 5f60d4dd27b2d85681491721f7ee737bdefb5355..52f502840fda4c7f3c73232a599414a8856128c9 100644
--- a/Framework/DataObjects/src/PeaksWorkspace.cpp
+++ b/Framework/DataObjects/src/PeaksWorkspace.cpp
@@ -605,14 +605,20 @@ void PeaksWorkspace::saveNexus(::NeXus::File *file) const {
   std::vector<double> goniometerMatrix(9 * np);
   std::vector<std::string> shapes(np);
 
+  // HKL is flipped by -1 due to different q convention in Crystallography.
+  // Always write out in ki-kf so consistent with old files
+  double qSign = 1.0;
+  std::string convention = ConfigService::Instance().getString("default.convention");
+  if (convention == "Crystallography") qSign = -1.0;
+
   // Populate column vectors from Peak Workspace
   size_t maxShapeJSONLength = 0;
   for (size_t i = 0; i < np; i++) {
     Peak p = peaks[i];
     detectorID[i] = p.getDetectorID();
-    H[i] = p.getH();
-    K[i] = p.getK();
-    L[i] = p.getL();
+    H[i] = qSign *p.getH();
+    K[i] = qSign *p.getK();
+    L[i] = qSign *p.getL();
     intensity[i] = p.getIntensity();
     sigmaIntensity[i] = p.getSigmaIntensity();
     binCount[i] = p.getBinCount();