[kstars] kstars: Re-work how alignment module options are generated for different modes (online, offline, remote, from file) and how they are saved between sessions. Move Alignment options from Ekos settings to alignment module own settings module.

Jasem Mutlaq null at kde.org
Mon Feb 20 19:29:56 UTC 2017


Git commit 9764bad786aa851f24493d0b5d6f79a5a3ce3b28 by Jasem Mutlaq.
Committed on 20/02/2017 at 19:27.
Pushed by mutlaqja into branch 'master'.

Re-work how alignment module options are generated for different modes (online, offline, remote, from file) and how they are saved between sessions. Move Alignment options from Ekos settings to alignment module own settings module.

BUGS:376708
FIXED-IN:17.04

CCMAIL:kstars-devel at kde.org

M  +5    -1    kstars/CMakeLists.txt
M  +259  -470  kstars/ekos/align/align.cpp
M  +29   -17   kstars/ekos/align/align.h
M  +26   -136  kstars/ekos/align/align.ui
D  +0    -696  kstars/ekos/align/astrometryoptions.ui
M  +8    -7    kstars/ekos/align/offlineastrometryparser.cpp
M  +3    -3    kstars/ekos/align/onlineastrometryparser.cpp
A  +91   -0    kstars/ekos/align/opsalign.cpp     [License: GPL (v2+)]
A  +48   -0    kstars/ekos/align/opsalign.h     [License: GPL (v2+)]
A  +207  -0    kstars/ekos/align/opsalign.ui
A  +156  -0    kstars/ekos/align/opsastrometry.cpp     [License: GPL (v2+)]
A  +51   -0    kstars/ekos/align/opsastrometry.h     [License: GPL (v2+)]
A  +741  -0    kstars/ekos/align/opsastrometry.ui
M  +1    -1    kstars/ekos/align/remoteastrometryparser.cpp
M  +21   -8    kstars/ekos/ekosmanager.cpp
M  +0    -63   kstars/ekos/opsekos.cpp
M  +0    -6    kstars/ekos/opsekos.h
M  +2    -208  kstars/ekos/opsekos.ui
M  +121  -64   kstars/kstars.kcfg

https://commits.kde.org/kstars/9764bad786aa851f24493d0b5d6f79a5a3ce3b28

diff --git a/kstars/CMakeLists.txt b/kstars/CMakeLists.txt
index 7baebad8d..ad318fb5d 100644
--- a/kstars/CMakeLists.txt
+++ b/kstars/CMakeLists.txt
@@ -129,7 +129,9 @@ if (INDI_FOUND)
                     ekos/capture/dslrinfo.ui
                     # Align
                     ekos/align/align.ui
-                    ekos/align/astrometryoptions.ui
+                    ekos/align/opsekos.ui
+                    ekos/align/opsastrometry.ui
+                    ekos/align/opsalign.ui
                     # Focus
                     ekos/focus/focus.ui
                     # Mount
@@ -176,6 +178,8 @@ if (INDI_FOUND)
                        ekos/align/align.cpp
                        ekos/align/alignview.cpp
                        ekos/align/astrometryparser.cpp
+                       ekos/align/opsastrometry.cpp
+                       ekos/align/opsalign.cpp
                        ekos/align/offlineastrometryparser.cpp
                        ekos/align/onlineastrometryparser.cpp
                        ekos/align/remoteastrometryparser.cpp
diff --git a/kstars/ekos/align/align.cpp b/kstars/ekos/align/align.cpp
index 3be686c19..f0df0bd21 100644
--- a/kstars/ekos/align/align.cpp
+++ b/kstars/ekos/align/align.cpp
@@ -20,6 +20,7 @@
 
 #include <QFileDialog>
 #include <KMessageBox>
+#include <KConfigDialog>
 #include <KNotifications/KNotification>
 
 #include "ekos/auxiliary/QProgressIndicator.h"
@@ -37,8 +38,8 @@
 #include "onlineastrometryparser.h"
 #include "offlineastrometryparser.h"
 #include "remoteastrometryparser.h"
-
-#include "ui_astrometryoptions.h"
+#include "opsastrometry.h"
+#include "opsalign.h"
 
 #include <basedevice.h>
 
@@ -87,7 +88,7 @@ Align::Align()
     retries=0;
     targetDiff=1e6;
     solverIterations=0;
-    fov_x=fov_y=0;
+    fov_x=fov_y=fov_pixscale=0;
 
     parser = NULL;
     solverFOV = new FOV();
@@ -116,10 +117,12 @@ Align::Align()
     connect(stopB, SIGNAL(clicked()), this, SLOT(abort()));
     connect(measureAltB, SIGNAL(clicked()), this, SLOT(measureAltError()));
     connect(measureAzB, SIGNAL(clicked()), this, SLOT(measureAzError()));
+#if 0
     connect(raBox, SIGNAL(textChanged( const QString & ) ), this, SLOT( checkLineEdits() ) );
     connect(decBox, SIGNAL(textChanged( const QString & ) ), this, SLOT( checkLineEdits() ) );
     connect(syncBoxesB, SIGNAL(clicked()), this, SLOT(copyCoordsToBoxes()));
     connect(clearBoxesB, SIGNAL(clicked()), this, SLOT(clearCoordBoxes()));
+#endif
     connect(editOptionsB,SIGNAL(clicked()), this, SLOT(slotEditOptions()));
 
     connect(CCDCaptureCombo, SIGNAL(activated(QString)), this, SLOT(setDefaultCCD(QString)));
@@ -143,13 +146,25 @@ Align::Align()
     gotoModeButtonGroup->button(currentGotoMode)->setChecked(true);
 
     editOptionsB->setIcon(QIcon::fromTheme("document-edit", QIcon(":/icons/breeze/default/document-edit.svg")));
-    editOptionsB->setAttribute(Qt::WA_LayoutUsesWidgetRect);
+    editOptionsB->setAttribute(Qt::WA_LayoutUsesWidgetRect);    
+    KConfigDialog* dialog = new KConfigDialog(this, "alignsettings", Options::self());
+
+    opsAlign = new OpsAlign(this);
+    dialog->addPage(opsAlign, i18n("Astrometry.net"));
+
+    opsAstrometry = new OpsAstrometry(this);
+    dialog->addPage(opsAstrometry, i18n("Solver Options"));
+    connect(editOptionsB, SIGNAL(clicked()), dialog, SLOT(show()));
+
+
+#if 0
     syncBoxesB->setIcon(QIcon::fromTheme("edit-copy", QIcon(":/icons/breeze/default/edit-copy.svg")));
     syncBoxesB->setAttribute(Qt::WA_LayoutUsesWidgetRect);
     clearBoxesB->setIcon(QIcon::fromTheme("edit-clear", QIcon(":/icons/breeze/default/edit-clear.svg")));
     clearBoxesB->setAttribute(Qt::WA_LayoutUsesWidgetRect);
 
     raBox->setDegType(false); //RA box should be HMS-style
+#endif
 
     appendLogText(i18n("Idle."));
 
@@ -196,7 +211,7 @@ Align::Align()
         connect(parser, SIGNAL(solverFailed()), this, SLOT(solverFailed()), Qt::UniqueConnection);
     }
 
-    solverOptions->setText(Options::solverOptions());
+    //solverOptions->setText(Options::solverOptions());
 
     // Which telescope info to use for FOV calculations
     //kcfg_solverOTA->setChecked(Options::solverOTA());
@@ -450,10 +465,9 @@ void Align::syncTelescopeInfo()
                                                                      QString::number(guideFL, 'f', 2),
                                                                      QString::number(guideAperture, 'f', 2)), Qt::ToolTipRole);
         calculateFOV();
-    }
 
-    if (currentCCD)
         generateArgs();
+    }
 }
 
 
@@ -488,7 +502,7 @@ void Align::syncCCDInfo()
 
     ISwitchVectorProperty *svp = currentCCD->getBaseDevice()->getSwitch("WCS_CONTROL");
     if (svp)
-        setWCSEnabled(Options::solverWCS());
+        setWCSEnabled(Options::astrometrySolverWCS());
 
     targetChip->setImageView(alignView, FITS_ALIGN);
 
@@ -515,20 +529,31 @@ void Align::syncCCDInfo()
         return;
 
     if (ccd_hor_pixel != -1 && ccd_ver_pixel != -1 && focal_length != -1 && aperture != -1)
+    {
         calculateFOV();
-
-    if (currentCCD && currentTelescope)
         generateArgs();
-
+    }
 }
 
+void Align::getFOVScale(double &fov_w, double & fov_h, double &fov_scale)
+{
+    fov_w = fov_x;
+    fov_h = fov_y;
+    fov_scale = fov_pixscale;
+}
 
 void Align::calculateFOV()
 {
     // Calculate FOV
+
+    // FOV in arcsecs
     fov_x = 206264.8062470963552 * ccd_width * ccd_hor_pixel / 1000.0 / focal_length;
     fov_y = 206264.8062470963552 * ccd_height * ccd_ver_pixel / 1000.0 / focal_length;
 
+    // Pix Scale
+    fov_pixscale = (fov_x * (Options::solverBinningIndex()+1)) / ccd_width;
+
+    // FOV in arcmins
     fov_x /= 60.0;
     fov_y /= 60.0;
 
@@ -549,14 +574,52 @@ void Align::calculateFOV()
                                     " 0.5 degrees</p><p>For small FOVs, use the Legacy Polar Alignment Tool.</p>"));
         FOVDisabledLabel->show();
     }
-}
 
+    if (opsAstrometry->kcfg_AstrometryUseImageScale->isChecked())
+    {
+        int unitType = opsAstrometry->kcfg_AstrometryImageScaleUnits->currentIndex();
+
+        // Degrees
+        if (unitType == 0)
+        {
+            double fov_low = qMin(fov_x/60, fov_y/60);
+            double fov_high= qMax(fov_x/60, fov_y/60);
+            opsAstrometry->kcfg_AstrometryImageScaleLow->setValue(fov_low);
+            opsAstrometry->kcfg_AstrometryImageScaleHigh->setValue(fov_high);
+
+            Options::setAstrometryImageScaleLow(fov_low);
+            Options::setAstrometryImageScaleHigh(fov_high);
+        }
+        // Arcmins
+        else if (unitType == 1)
+        {
+            double fov_low = qMin(fov_x, fov_y);
+            double fov_high= qMax(fov_x, fov_y);
+            opsAstrometry->kcfg_AstrometryImageScaleLow->setValue(fov_low);
+            opsAstrometry->kcfg_AstrometryImageScaleHigh->setValue(fov_high);
+
+            Options::setAstrometryImageScaleLow(fov_low);
+            Options::setAstrometryImageScaleHigh(fov_high);
+        }
+        // Arcsec per pixel
+        else
+        {
+            opsAstrometry->kcfg_AstrometryImageScaleLow->setValue(fov_pixscale*0.9);
+            opsAstrometry->kcfg_AstrometryImageScaleHigh->setValue(fov_pixscale*1.1);
+
+            // 10% boundary
+            Options::setAstrometryImageScaleLow(fov_pixscale*0.9);
+            Options::setAstrometryImageScaleHigh(fov_pixscale*1.1);
+        }
+    }
+}
 
 //This starts upthe Astrometry Options Dialog Window and connects the various buttons and line edits to slots.
 //If accepted upon dialog close,the astrometry solver options are updated.
 
-void Align::slotEditOptions(){
-
+void Align::slotEditOptions()
+{
+#if 0
     QDialog astrometryOptionsDialog;
     astrometryOptions.setupUi(&astrometryOptionsDialog);
 
@@ -607,402 +670,89 @@ void Align::slotEditOptions(){
         solverOptions->setText(astrometryOptions.solverOptions->text().simplified());
     }
 
+#endif
 }
 
-//This interprets the solver options to set the checkboxes and line edits to the values contained in the sovler arguments
-
-void Align::slotUpdateAstrometryOptionEditor(QString text){
-    QString options = text.simplified();
-    QStringList solver_args;
-    solver_args = options.split(" ");
-
-    int index=-1;
-    int index2=-1;
-    int index3=-1;
-    bool allExist=false;
-
-    index = solver_args.indexOf("--no-fits2fits");
-    astrometryOptions.checkFits2Fits->setChecked(index != -1);
-
-    index = solver_args.indexOf("--resort");
-    astrometryOptions.checkResort->setChecked(index != -1);
-
-    index = solver_args.indexOf("--no-verify");
-    astrometryOptions.checkVerify->setChecked(index != -1);
-
-    index = solver_args.indexOf("--downsample");
-    astrometryOptions.checkDownSample->setChecked(index != -1);
-    if(index != -1 && index != solver_args.count()-1){
-        QString nextValue=solver_args.at(index+1);
-        if(!nextValue.startsWith('-'))
-            astrometryOptions.downSampleValue->setText(solver_args.at(index+1));
-    }
-
-    index = solver_args.indexOf("-L");
-    index2 = solver_args.indexOf("-H");
-    index3 = solver_args.indexOf("-u");
-    allExist=index != -1 && index2 != -1 && index3 != -1;
-    astrometryOptions.checkScale->setChecked(allExist);
-
-    QString fov_low,fov_high;
-    QString units="aw";
-    QComboBox *comboBox=astrometryOptions.unitSelector;
-    if(comboBox->currentIndex()==0)
-        units="dw";
-    if(comboBox->currentIndex()==1)
-        units="aw";
-    generateFOV(fov_low,fov_high, units);
-
-    if(index!=-1){
-        if(index!=solver_args.count()-1){
-            QString nextValue=solver_args.at(index+1);
-            if(!nextValue.startsWith('-'))
-                    astrometryOptions.scaleL->setText(solver_args.at(index+1));
-        }
-    }else
-        astrometryOptions.scaleL->setText(fov_low);
-
-    if(index2!=-1){
-        if(index2!=solver_args.count()-1){
-            QString nextValue=solver_args.at(index+1);
-            if(!nextValue.startsWith('-'))
-                    astrometryOptions.scaleH->setText(solver_args.at(index2+1));
-        }
-    }else
-        astrometryOptions.scaleH->setText(fov_high);
-
-    if(index3!=-1){
-        if(index3!=solver_args.count()-1){
-            QString nextValue=solver_args.at(index3+1);
-            if(nextValue=="dw")
-                astrometryOptions.unitSelector->setCurrentIndex(0);
-            if(nextValue=="aw")
-                astrometryOptions.unitSelector->setCurrentIndex(1);
-        }
-    }
-
-    index = solver_args.indexOf("-3");
-    index2 = solver_args.indexOf("-4");
-    index3 = solver_args.indexOf("-5");
-    allExist=index != -1 && index2 != -1 && index3 != -1;
-    astrometryOptions.checkPosition->setChecked(allExist);
-
-    if (raBox->isEmpty() == false && decBox->isEmpty() == false){
-        astrometryOptions.estRA->setText(raBox->text());
-        astrometryOptions.estDec->setText(decBox->text());
-    }
-
-    index = solver_args.indexOf("-5");
-    if(index != -1 && index != solver_args.count()-1){
-        QString nextValue=solver_args.at(index+1);
-        if(!nextValue.startsWith('-'))
-            astrometryOptions.estRadius->setText(solver_args.at(index+1));
-    }
-
-    //We might not want to force these, but if they don't have these options selected, it will cause problems.
-
-    index = solver_args.indexOf("--no-plots");
-    if(index==-1){
-        solver_args.prepend("--no-plots");
-        astrometryOptions.solverOptions->setText(solver_args.join(" "));
-    }
-
-    index = solver_args.indexOf("-O");
-    if(index==-1){
-        solver_args.prepend("-O");
-        astrometryOptions.solverOptions->setText(solver_args.join(" "));
-    }
-}
-
-//This updates solver options in real time based on line edits the user makes.
-
-void Align::slotUpdateLineEditOptions(){
-    QString options = astrometryOptions.solverOptions->text().simplified();
-    QStringList solver_args;
-    solver_args = options.split(" ");
-    QLineEdit *lineEdit=(QLineEdit *)sender();
-    QString argument;
-
-    if(lineEdit==astrometryOptions.downSampleValue)
-        argument="--downsample";
-    if(lineEdit==astrometryOptions.scaleL)
-        argument="-L";
-    if(lineEdit==astrometryOptions.scaleH)
-        argument="-H";
-    if(lineEdit==astrometryOptions.estRA)
-        argument="-3";
-    if(lineEdit==astrometryOptions.estDec)
-        argument="-4";
-    if(lineEdit==astrometryOptions.estRadius)
-        argument="-5";
-
-    if(argument=="")
-        return;
-
-    if(lineEdit==astrometryOptions.estRA){
-        bool raOk=false;
-        dms ra( astrometryOptions.estRA->createDms( false, &raOk ));
-        if(raOk){
-            if ( ra.Hours() < 0.0 || ra.Hours() > 24.0 ){
-                KMessageBox::sorry( 0, i18n( "The Right Ascension value must be between 0.0 and 24.0." ), i18n( "Invalid Coordinate Data" ) );
-                return;
-            }
-            editAstrometryOption(solver_args, argument, QString().setNum(ra.Degrees()));
-        }
-    }else if(lineEdit==astrometryOptions.estDec){
-        bool decOk=false;
-        dms dec( astrometryOptions.estDec->createDms( true, &decOk ));
-        if(decOk){
-            if ( dec.Degrees() < -90.0 || dec.Degrees() > 90.0 ){
-                KMessageBox::sorry( 0, i18n( "The Declination value must be between -90.0 and 90.0." ), i18n( "Invalid Coordinate Data" ) );
-                return;
-            }
-            editAstrometryOption(solver_args, argument, QString().setNum(dec.Degrees()));
-        }
-    }else{
-        editAstrometryOption(solver_args, argument, lineEdit->text());
-    }
-
-    astrometryOptions.solverOptions->setText(solver_args.join(" "));
-
-
-}
-
-//This updates the telescope/image field scale in the astrometry options editor to match the currently connected devices.
-
-void Align::slotUpdateScaleInEditor(){
+QStringList Align::generateOptions(const QVariantMap & optionsMap)
+{
+    // -O overwrite
+    // -3 Expected RA
+    // -4 Expected DEC
+    // -5 Radius (deg)
+    // -L lower scale of image in arcminutes
+    // -H upper scale of image in arcmiutes
+    // -u aw set scale to be in arcminutes
+    // -W solution.wcs name of solution file
+    // apog1.jpg name of target file to analyze
+    //solve-field -O -3 06:40:51 -4 +09:49:53 -5 1 -L 40 -H 100 -u aw -W solution.wcs apod1.jpg
 
-    QString options = astrometryOptions.solverOptions->text().simplified();
     QStringList solver_args;
-    solver_args = options.split(" ");
 
-    QString fov_low,fov_high;
-    QString units="aw";
-    QComboBox *comboBox=astrometryOptions.unitSelector;
-    if(comboBox->currentIndex()==0)
-        units="dw";
-    if(comboBox->currentIndex()==1)
-        units="aw";
-
-    generateFOV(fov_low,fov_high, units);
-
-    astrometryOptions.scaleL->setText(fov_low);
-    astrometryOptions.scaleH->setText(fov_high);
+    // Start with always-used arguments
+    solver_args << "-O" << "--no-plots";
 
-    editAstrometryOption(solver_args, "-L", fov_low);
-    editAstrometryOption(solver_args, "-H", fov_high);
-
-    astrometryOptions.solverOptions->setText(solver_args.join(" "));
-
-}
+    // Now go over boolean options
 
-//This updates the RA and DEC position in the astrometry options editor to match the current telescope position.
+    // noverify
+    if (optionsMap.contains("noverify"))
+        solver_args << "--no-verify";
 
-void Align::slotUpdatePositionInEditor(){
+    // noresort
+    if (optionsMap.contains("resort"))
+        solver_args << "--resort";
 
-    QString options = astrometryOptions.solverOptions->text().simplified();
-    QStringList solver_args;
-    solver_args = options.split(" ");
+    // fits2fits
+    if (optionsMap.contains("nofits2fits"))
+        solver_args << "--no-fits2fits";
 
-    raBox->setText(ScopeRAOut->text());
-    decBox->setText(ScopeDecOut->text());
-    astrometryOptions.estRA->setText(ScopeRAOut->text());
-    astrometryOptions.estDec->setText(ScopeDecOut->text());
+    // downsample
+    if (optionsMap.contains("downsample"))
+        solver_args << "--downsample" << QString::number(optionsMap.value("downsample", 2).toInt());
 
-    bool raOk=false;
-    dms ra( astrometryOptions.estRA->createDms( false, &raOk ));
-    if(raOk)
-        editAstrometryOption(solver_args, "-3", QString().setNum(ra.Degrees()));
+    // image scale low
+    if (optionsMap.contains("scaleL"))
+        solver_args << "-L" << QString::number(optionsMap.value("scaleL").toDouble());
 
-    bool decOk=false;
-    dms dec( astrometryOptions.estDec->createDms( true, &decOk ));
-    if(decOk)
-        editAstrometryOption(solver_args, "-4", QString().setNum(dec.Degrees()));
+    // image scale high
+    if (optionsMap.contains("scaleH"))
+        solver_args << "-H" << QString::number(optionsMap.value("scaleH").toDouble());
 
-    astrometryOptions.solverOptions->setText(solver_args.join(" "));
-}
+    // image scale units
+    if (optionsMap.contains("scaleUnits"))
+        solver_args << "-u" << optionsMap.value("scaleUnits").toString();
 
-//This will reset the options in the astrometry options editor to the original options before editing.
+    // RA
+    if (optionsMap.contains("ra"))
+        solver_args << "-3" << QString::number(optionsMap.value("ra").toDouble());
 
-void Align::slotResetOptionsInEditor(){
+    // DE
+    if (optionsMap.contains("de"))
+        solver_args << "-4" << QString::number(optionsMap.value("de").toDouble());
 
-    astrometryOptions.solverOptions->setText(solverOptions->text().simplified());
-    slotUpdateAstrometryOptionEditor(solverOptions->text().simplified());
-}
+    // Radius
+    if (optionsMap.contains("radius"))
+        solver_args << "-5" << QString::number(optionsMap.value("radius").toDouble());
 
-//This will replace the options in the astrometry options editor to the default options set.
+    // Custom
+    if (optionsMap.contains("custom"))
+        solver_args << optionsMap.value("custom").toString();
 
-void Align::slotDefaultEditorOptions(){
-
-    double ra=0,dec=0;
-    QString ra_dms, dec_dms;
-    QStringList solver_args;
-
-    currentTelescope->getEqCoords(&ra, &dec);
-
-    QString fov_low,fov_high;
-    generateFOV(fov_low,fov_high,"aw");
-
-    getFormattedCoords(ra, dec, ra_dms, dec_dms);
-
-    solver_args << "--no-verify" << "--no-plots" << "--resort" << "--no-fits2fits"
-                << "--downsample" << "2" << "-O" << "-L"
-                << fov_low << "-H" << fov_high << "-u" << "aw"
-                << "-3" << "0" << "-4" << "0" << "-5" << "30";
-
-    slotUpdateAstrometryOptionEditor(solver_args.join(" "));
-    astrometryOptions.solverOptions->setText(solver_args.join(" "));
-
-    slotUpdatePositionInEditor();
-}
-
-//This will attempt to remove options that have additional arguments, if none is found, it will just remove the option.
-//If the option is not found, it does nothing
-
-void Align::removeAstrometryOption(QStringList &solver_args,QString option){
-    if(option=="")
-        return;
-    int index=solver_args.indexOf(option);
-    if(index!=-1){
-        if(index!=solver_args.count()-1){
-            QString nextValue=solver_args.at(index+1);
-            if(!nextValue.startsWith('-'))
-                    solver_args.removeAt(index+1);
-        }
-        solver_args.removeAt(index);
-    }
-}
-
-//This will attempt to edit the arguments of options that have additional arguments, if none is found, it will insert it.
-//If the option is not found, it does nothing
-
-void Align::editAstrometryOption(QStringList &solver_args,QString option, QString argument){
-    if(argument==""||option=="")
-        return;
-    int index=solver_args.indexOf(option);
-    if(index!=-1){
-        if(index!=solver_args.count()-1){
-            QString nextValue=solver_args.at(index+1);
-            if(!nextValue.startsWith('-'))
-                   solver_args.replace(index+1, argument);
-                else
-                   solver_args.insert(index+1, argument);
-        }
-    }
-}
-
-//This respond to checkbox clicks in the astrometry options editor to either add or remove options in the solver arguments.
-
-void Align::slotToggleAstrometryOptions(){
-    QString options = astrometryOptions.solverOptions->text().simplified();
-    QStringList solver_args;
-    solver_args = options.split(" ");
-
-    QString units="aw";
-    QComboBox *comboBox=astrometryOptions.unitSelector;
-    if(comboBox->currentIndex()==0)
-        units="dw";
-    if(comboBox->currentIndex()==1)
-        units="aw";
-
-    QObject *object=sender();
-    if(object){
-        if(object==comboBox){
-            editAstrometryOption(solver_args,"-u", units);
-        }else{
-            QCheckBox *checkBox=(QCheckBox *)object;
-            if(checkBox==astrometryOptions.checkPosition){
-                if(!checkBox->isChecked()){
-                    removeAstrometryOption(solver_args,"-3");
-                    removeAstrometryOption(solver_args,"-4");
-                    removeAstrometryOption(solver_args,"-5");
-                } else{
-                    bool raOk(false), decOk(false);
-                    dms ra( astrometryOptions.estRA->createDms( false, &raOk ));
-                    dms dec( astrometryOptions.estDec->createDms( true, &decOk ));
-                    if(raOk && decOk){
-                        if(solver_args.indexOf("-3")==-1){
-                            solver_args.append("-3");
-                            solver_args.append(QString().setNum(ra.Degrees()));
-                        }
-                        if(solver_args.indexOf("-4")==-1){
-                            solver_args.append("-4");
-                            solver_args.append(QString().setNum(dec.Degrees()));
-                        }
-                        if(solver_args.indexOf("-5")==-1){
-                            solver_args.append("-5");
-                            solver_args.append(astrometryOptions.estRadius->text());
-                        }
-                    }
-                }
-            } else if(checkBox==astrometryOptions.checkScale){
-                if(!checkBox->isChecked()){
-                    removeAstrometryOption(solver_args,"-L");
-                    removeAstrometryOption(solver_args,"-H");
-                    removeAstrometryOption(solver_args,"-u");
-                } else{
-                    if(solver_args.indexOf("-L")==-1){
-                        solver_args.append("-L");
-                        solver_args.append(astrometryOptions.scaleL->text());
-                    }
-                    if(solver_args.indexOf("-H")==-1){
-                        solver_args.append("-H");
-                        solver_args.append(astrometryOptions.scaleH->text());
-                    }
-                    if(solver_args.indexOf("-u")==-1){
-                        solver_args.append("-u");
-                        solver_args.append(units);
-                    }
-                }
-            } else if(checkBox==astrometryOptions.checkDownSample){
-                QString argument="--downsample";
-                int index=-1;
-                index = solver_args.indexOf(argument);
-                if(checkBox->isChecked() && index==-1){
-                    solver_args.append(argument);
-                    solver_args.append(astrometryOptions.downSampleValue->text());
-                }
-                if(!checkBox->isChecked()){
-                    removeAstrometryOption(solver_args,argument);
-                }
-            } else{
-                //This case governs all the simple options at the top.
-
-                QString argument=checkBox->text();
-                argument.remove(QChar('&'), Qt::CaseInsensitive);//This is needed because the labels have ampersands in them for keyboard shortcuts.
-
-                int index=-1;
-                index = solver_args.indexOf(argument);
-                if(checkBox->isChecked() && index==-1)
-                    solver_args.prepend(argument);
-                if(!checkBox->isChecked() && index!=-1)
-                    solver_args.removeAt(index);
-            }
-        }
-        astrometryOptions.solverOptions->setText(solver_args.join(" "));
-    }
+    return solver_args;
 }
 
 //This will generate the high and low scale of the imager field size based on the stated units.
-void Align::generateFOV(QString &fov_low, QString &fov_high, QString units)
+void Align::generateFOVBounds(double fov_h, double fov_v, QString &fov_low, QString &fov_high)
 {
     double fov_lower, fov_upper;
     // let's stretch the boundaries by 5%
-    fov_lower = ((fov_x < fov_y) ? (fov_x * 0.95) : (fov_y * 0.95));
-    fov_upper = ((fov_x > fov_y) ? (fov_x * 1.05) : (fov_y * 1.05));
-
-    if(units=="dw")
-    {
-        fov_lower /=60;
-        fov_upper /=60;
-    }
+    fov_lower = ((fov_h < fov_v) ? (fov_h * 0.95) : (fov_v * 0.95));
+    fov_upper = ((fov_h > fov_v) ? (fov_h * 1.05) : (fov_v * 1.05));
 
     //No need to do anything if they are aw, since that is the default
-    fov_low  = QString("%1").arg(fov_lower);
-    fov_high = QString("%1").arg(fov_upper);
+    fov_low  = QString::number(fov_lower);
+    fov_high = QString::number(fov_upper);
 }
 
-
 void Align::generateArgs()
 {
     // -O overwrite
@@ -1014,93 +764,78 @@ void Align::generateArgs()
     // -u aw set scale to be in arcminutes
     // -W solution.wcs name of solution file
     // apog1.jpg name of target file to analyze
-    //solve-field -O -3 06:40:51 -4 +09:49:53 -5 1 -L 40 -H 100 -u aw -W solution.wcs apod1.jpg
+    //solve-field -O -3 06:40:51 -4 +09:49:53 -5 1 -L 40 -H 100 -u aw -W solution.wcs apod1.jpg    
 
-    double ra=0,dec=0;
-    QString ra_dms, dec_dms;
-    QStringList solver_args;
+    QVariantMap optionsMap;
 
-    currentTelescope->getEqCoords(&ra, &dec);
+    if (Options::astrometryUseNoVerify())
+        optionsMap["noverify"] = true;
 
-    QString fov_low,fov_high;
+    if (Options::astrometryUseResort())
+        optionsMap["resort"] = true;
 
+    if (Options::astrometryUseNoFITS2FITS())
+        optionsMap["nofits2fits"] = true;
 
-    getFormattedCoords(ra, dec, ra_dms, dec_dms);
+    if (Options::astrometryUseDownsample())
+        optionsMap["downsample"] = Options::astrometryDownsample();
 
-    if (solverOptions->text().isEmpty())
+    if (Options::astrometryUseImageScale())
     {
-        generateFOV(fov_low,fov_high,"aw");
+        QString units = ImageScales[Options::astrometryImageScaleUnits()];
+        if (Options::astrometryAutoUpdateImageScale())
+        {
+            QString fov_low,fov_high;
+            double fov_w = fov_x;
+            double fov_h = fov_y;
 
-        solver_args << "--no-verify" << "--no-plots" << "--resort" << "--no-fits2fits"
-                    << "--downsample" << "2" << "-O" << "-L" << fov_low << "-H" << fov_high << "-u" << "aw";
-    }
-    else
-    {
-        QString options = solverOptions->text().simplified();
-        solver_args = options.split(" ");
+            if (units == "dw")
+            {
+                fov_w /= 60;
+                fov_h /= 60;
+            }
+            else if (units == "app")
+            {
+                fov_w = fov_pixscale;
+                fov_h = fov_pixscale;
+            }
+
+            generateFOVBounds(fov_w, fov_h, fov_low, fov_high);
 
-        QString units="aw";
-        int units_index = solver_args.indexOf("-u");
-        if(units_index!=-1&&units_index!=solver_args.count()-1)
+            optionsMap["scaleL"] = fov_low;
+            optionsMap["scaleH"] = fov_high;
+            optionsMap["scaleUnits"] = units;
+        }
+        else
         {
-            if (solver_args.at(units_index+1)=="dw")
-                units=solver_args.at(units_index+1);
+            optionsMap["scaleL"] = Options::astrometryImageScaleLow();
+            optionsMap["scaleH"] = Options::astrometryImageScaleHigh();
+            optionsMap["scaleUnits"] = units;
         }
-
-        generateFOV(fov_low,fov_high,units);
-        int fov_low_index = solver_args.indexOf("-L");
-        if (fov_low_index != -1)
-            solver_args.replace(fov_low_index+1, fov_low);
-        int fov_high_index = solver_args.indexOf("-H");
-        if (fov_high_index != -1)
-            solver_args.replace(fov_high_index+1, fov_high);
     }
 
-    if (raBox->isEmpty() == false && decBox->isEmpty() == false)
+    if (Options::astrometryUsePosition())
     {
-        bool raOk(false), decOk(false);
-        dms ra( raBox->createDms( false, &raOk ) ); //false means expressed in hours
-        dms dec( decBox->createDms( true, &decOk ) );
-        int radius = 30;
-        QString message;
+        double ra=0,dec=0;
+        currentTelescope->getEqCoords(&ra, &dec);
 
-        if ( raOk && decOk )
-        {
-            //make sure values are in valid range
-            if ( ra.Hours() < 0.0 || ra.Hours() > 24.0 )
-                message = i18n( "The Right Ascension value must be between 0.0 and 24.0." );
-            if ( dec.Degrees() < -90.0 || dec.Degrees() > 90.0 )
-                message += '\n' + i18n( "The Declination value must be between -90.0 and 90.0." );
-            if ( ! message.isEmpty() )
-            {
-                KMessageBox::sorry( 0, message, i18n( "Invalid Coordinate Data" ) );
-                return;
-            }
-        }
-
-        int ra_index = solver_args.indexOf("-3");
-        if (ra_index == -1)
-            solver_args << "-3" << QString().setNum(ra.Degrees());
-        else
-            solver_args.replace(ra_index+1, QString().setNum(ra.Degrees()));
+        optionsMap["ra"] = ra*15.0;
+        optionsMap["de"] = dec;
+        optionsMap["radius"] = Options::astrometryRadius();
+    }
 
-        int de_index = solver_args.indexOf("-4");
-        if (de_index == -1)
-            solver_args << "-4" << QString().setNum(dec.Degrees());
-        else
-            solver_args.replace(de_index+1, QString().setNum(dec.Degrees()));
+    if (Options::astrometryCustomOptions().isEmpty() == false)
+        optionsMap["custom"] = Options::astrometryCustomOptions();
 
-        int rad_index = solver_args.indexOf("-5");
-        if (rad_index == -1)
-            solver_args << "-5" << QString().setNum(radius);
-        else
-            solver_args.replace(rad_index+1, QString().setNum(radius));
 
-     }
+    QStringList solverArgs = generateOptions(optionsMap);
 
-    solverOptions->setText(solver_args.join(" "));
+    QString options = solverArgs.join(" ");
+    solverOptions->setText(options);
+    solverOptions->setToolTip(options);
 }
 
+#if 0
 void Align::checkLineEdits()
 {
    bool raOk(false), decOk(false);
@@ -1125,6 +860,7 @@ void Align::clearCoordBoxes()
 
     generateArgs();
 }
+#endif
 
 bool Align::captureAndSolve()
 {
@@ -1379,7 +1115,23 @@ void Align::startSolving(const QString &filename, bool isGenerated)
         int rc = KMessageBox::questionYesNoCancel(0, i18n("No metadata is available in this image. Do you want to use the blind solver or the existing solver settings?"), i18n("Astrometry solver"),
                                          blindItem, existingItem, KStandardGuiItem::cancel(), "blind_solver_or_existing_solver_option");
         if (rc == KMessageBox::Yes)
-            solverArgs << "--no-verify" << "--no-plots" << "--resort" << "--no-fits2fits" << "--downsample" << "2" << "-O";
+        {
+            QVariantMap optionsMap;
+
+            if (Options::astrometryUseNoVerify())
+                optionsMap["noverify"] = true;
+
+            if (Options::astrometryUseResort())
+                optionsMap["resort"] = true;
+
+            if (Options::astrometryUseNoFITS2FITS())
+                optionsMap["nofits2fits"] = true;
+
+            if (Options::astrometryUseDownsample())
+                optionsMap["downsample"] = Options::astrometryDownsample();
+
+            solverArgs = generateOptions(optionsMap);
+        }
         else if (rc == KMessageBox::No)
             solverArgs = options.split(" ");
         else
@@ -1398,7 +1150,7 @@ void Align::startSolving(const QString &filename, bool isGenerated)
     }
 
     Options::setSolverType(solverTypeGroup->checkedId());
-    Options::setSolverOptions(solverOptions->text());
+    //Options::setSolverOptions(solverOptions->text());
     Options::setGuideScopeCCDs(guideScopeCCDs);
     Options::setSolverAccuracyThreshold(accuracySpin->value());
     Options::setAlignDarkFrame(alignDarkFrameCheck->isChecked());
@@ -1438,7 +1190,7 @@ void Align::solverFinished(double orientation, double ra, double dec, double pix
     ISD::CCDChip *targetChip = currentCCD->getChip(useGuideHead ? ISD::CCDChip::GUIDE_CCD : ISD::CCDChip::PRIMARY_CCD);
     targetChip->getBinning(&binx, &biny);
 
-    if (Options::solverVerbose())
+    if (Options::astrometrySolverVerbose())
         appendLogText(i18n("Solver RA (%1) DEC (%2) Orientation (%3) Pixel Scale (%4)", QString::number(ra, 'g' , 5), QString::number(dec, 'g' , 5),
                             QString::number(orientation, 'g' , 5), QString::number(pixscale, 'g' , 5)));
 
@@ -1474,7 +1226,7 @@ void Align::solverFinished(double orientation, double ra, double dec, double pix
 
      solverFOV->setCenter(alignCoord);
      solverFOV->setRotation(sOrientation);
-     solverFOV->setImageDisplay(Options::solverOverlay());
+     solverFOV->setImageDisplay(Options::astrometrySolverOverlay());
 
      QString ra_dms, dec_dms;
      getFormattedCoords(alignCoord.ra().Hours(), alignCoord.dec().Degrees(), ra_dms, dec_dms);
@@ -1482,7 +1234,7 @@ void Align::solverFinished(double orientation, double ra, double dec, double pix
      SolverRAOut->setText(ra_dms);
      SolverDecOut->setText(dec_dms);
 
-     if (Options::solverWCS())
+     if (Options::astrometrySolverWCS())
      {
          INumberVectorProperty *ccdRotation = currentCCD->getBaseDevice()->getNumber("CCD_ROTATION");
          if (ccdRotation)
@@ -1692,8 +1444,16 @@ void Align::processTelescopeNumber(INumberVectorProperty *coord)
         case IPS_OK:
         {
             // Update the boxes as the mount just finished slewing
-            if (slew_dirty && Options::solverUpdateCoords())
-                copyCoordsToBoxes();
+            if (slew_dirty && Options::astrometryAutoUpdatePosition())
+            {
+                opsAstrometry->estRA->setText(ra_dms);
+                opsAstrometry->estDec->setText(dec_dms);
+
+                Options::setAstrometryPositionRA(coord->np[0].value*15);
+                Options::setAstrometryPositionDE(coord->np[1].value);
+
+                generateArgs();
+            }
 
             if (slew_dirty && pahStage == PAH_FIND_CP)
             {
@@ -1893,8 +1653,9 @@ void Align::processTelescopeNumber(INumberVectorProperty *coord)
     }
 
 
-    if (!strcmp(coord->name, "TELESCOPE_INFO"))
-        syncTelescopeInfo();
+    // N.B. EkosManager already mananges TELESCOPE_INFO, why here again?
+    //if (!strcmp(coord->name, "TELESCOPE_INFO"))
+        //syncTelescopeInfo();
 
 }
 
@@ -2455,6 +2216,14 @@ void Align::setBinningIndex(int binIndex)
        binningCombo->setCurrentIndex(binIndex);
        binningCombo->blockSignals(false);
    }
+
+   // Need to calculate FOV and args for APP
+   if (Options::astrometryImageScaleUnits() == OpsAstrometry::SCALE_ARCSECPERPIX)
+   {
+       calculateFOV();
+       generateArgs();
+   }
+
 }
 
 void Align::setSolverArguments(const QString & value)
@@ -2463,13 +2232,14 @@ void Align::setSolverArguments(const QString & value)
 }
 
 void Align::setSolverSearchCoords(double ra, double dec)
-{
+{    
     dms RA, DEC;
     RA.setH(ra);
     DEC.setD(dec);
 
-    raBox->setText(RA.toHMSString());
-    decBox->setText(DEC.toDMSString());
+    //TODO
+    //raBox->setText(RA.toHMSString());
+    //decBox->setText(DEC.toDMSString());
 }
 
 void Align::setUseOAGT(bool enabled)
@@ -2586,12 +2356,24 @@ QStringList Align::getSolverOptionsFromFITS(const QString &filename)
     QString fov_low,fov_high;
     QStringList solver_args;
 
-    // If existing options have no-fits2fits then we use it, otherwise we discard it
-    // as no-fits2fits is only works for astrometry.net v0.67 or less
-    if (solverOptions->text().contains("no-fits2fits"))
-        solver_args << "--no-verify" << "--no-plots" << "--resort" << "--no-fits2fits" << "--downsample" << "2" << "-O";
-    else
-        solver_args << "--no-verify" << "--no-plots" << "--resort" << "--downsample" << "2" << "-O";
+    QVariantMap optionsMap;
+
+    if (Options::astrometryUseNoVerify())
+        optionsMap["noverify"] = true;
+
+    if (Options::astrometryUseResort())
+        optionsMap["resort"] = true;
+
+    if (Options::astrometryUseNoFITS2FITS())
+        optionsMap["nofits2fits"] = true;
+
+    if (Options::astrometryUseDownsample())
+        optionsMap["downsample"] = Options::astrometryDownsample();
+
+    if (Options::astrometryCustomOptions().isEmpty() == false)
+        optionsMap["custom"] = Options::astrometryCustomOptions();
+
+    solver_args = generateOptions(optionsMap);
 
     if (fits_open_image(&fptr, filename.toLatin1(), READONLY, &status))
     {
@@ -2680,8 +2462,11 @@ QStringList Align::getSolverOptionsFromFITS(const QString &filename)
     fits_fov_y /= 60.0;
 
     // let's stretch the boundaries by 5%
-    fov_lower = ((fits_fov_x < fits_fov_y) ? (fits_fov_x *0.95) : (fits_fov_y *0.95));
-    fov_upper = ((fits_fov_x > fits_fov_y) ? (fits_fov_x * 1.05) : (fits_fov_y * 1.05));
+    fov_lower = qMin(fits_fov_x, fits_fov_y);
+    fov_upper = qMax(fits_fov_x, fits_fov_y);
+
+    fov_lower *= 0.95;
+    fov_upper *= 1.05;
 
     fov_low  = QString::number(fov_lower);
     fov_high = QString::number(fov_upper);
@@ -3300,8 +3085,12 @@ void Align::setMountStatus(ISD::Telescope::TelescopeStatus newState)
         break;
 
     case ISD::Telescope::MOUNT_TRACKING:
-        solveB->setEnabled(true);
-        loadSlewB->setEnabled(true);
+        if (pi->isAnimated() == false)
+        {
+            solveB->setEnabled(true);
+            loadSlewB->setEnabled(true);
+        }
+
         PAHFirstCaptureB->setEnabled(true);
         PAHSecondCaptureB->setEnabled(true);
         PAHThirdCaptureB->setEnabled(true);
diff --git a/kstars/ekos/align/align.h b/kstars/ekos/align/align.h
index 33098689e..9d9af317c 100644
--- a/kstars/ekos/align/align.h
+++ b/kstars/ekos/align/align.h
@@ -37,6 +37,8 @@ class AstrometryParser;
 class OnlineAstrometryParser;
 class OfflineAstrometryParser;
 class RemoteAstrometryParser;
+class OpsAstrometry;
+class OpsAlign;
 
 /**
  *@class Align
@@ -67,6 +69,9 @@ public:
     typedef enum { PAH_IDLE, PAH_FIRST_CAPTURE, PAH_FIND_CP, PAH_FIRST_ROTATE, PAH_SECOND_CAPTURE, PAH_SECOND_ROTATE, PAH_THIRD_CAPTURE, PAH_STAR_SELECT, PAH_PRE_REFRESH, PAH_REFRESH, PAH_ERROR } PAHStage;
     typedef enum { NORTH_HEMISPHERE, SOUTH_HEMISPHERE } HemisphereType;
 
+    // Image Scales
+    const QStringList ImageScales = { "dw", "aw", "app" };
+
     enum CircleSolution { NO_CIRCLE_SOLUTION, ONE_CIRCLE_SOLUTION, TWO_CIRCLE_SOLUTION, INFINITE_CIRCLE_SOLUTION };
 
     /** @defgroup AlignDBusInterface Ekos DBus Interface - Align Module
@@ -174,9 +179,7 @@ public:
     /**
      * @brief Generate arguments we pass to the online and offline solvers. Keep user own arguments in place.
      */
-    void generateArgs();
-
-    void generateFOV(QString &fov_low, QString &fov_high, QString units);
+    void generateArgs();    
 
     /**
      * @brief Does our parser exist in the system?
@@ -198,6 +201,22 @@ public:
      */
     FOV *fov();
 
+    /**
+     * @brief getFOVScale Returns calculated FOV values
+     * @param fov_w FOV width in arcmins
+     * @param fov_h FOV height in arcmins
+     * @param fov_scale FOV scale in arcsec per pixel
+     */
+    void getFOVScale(double &fov_w, double & fov_h, double &fov_scale);
+
+    /**
+     * @brief generateOptions Generate astrometry.net option given the supplied map
+     * @param optionsMap List of key=value pairs for all astrometry.net options
+     * @return String List of valid astrometry.net options
+     */
+    static QStringList generateOptions(const QVariantMap & optionsMap);
+    static void generateFOVBounds(double fov_h, double fov_v, QString &fov_low, QString &fov_high);
+
 
 public slots:
 
@@ -303,19 +322,12 @@ public slots:
     void setMountStatus(ISD::Telescope::TelescopeStatus newState);
 
     void slotEditOptions();
-    void slotUpdateLineEditOptions();
-    void slotToggleAstrometryOptions();
-    void slotUpdateAstrometryOptionEditor(QString text);
-    void slotUpdateScaleInEditor();
-    void slotUpdatePositionInEditor();
-    void slotResetOptionsInEditor();
-    void slotDefaultEditorOptions();
 
 private slots:
     /* Solver Options */
-    void checkLineEdits();
-    void copyCoordsToBoxes();
-    void clearCoordBoxes();
+    //void checkLineEdits();
+    //void copyCoordsToBoxes();
+    //void clearCoordBoxes();
 
     /* Polar Alignment */
     void measureAltError();
@@ -452,7 +464,7 @@ private:
     //bool isFocusBusy;
 
     // FOV
-    double ccd_hor_pixel, ccd_ver_pixel, focal_length, aperture, fov_x, fov_y;
+    double ccd_hor_pixel, ccd_ver_pixel, focal_length, aperture, fov_x, fov_y, fov_pixscale;
     int ccd_width, ccd_height;
 
     // Keep track of solver results
@@ -562,9 +574,9 @@ private:
     // Which hemisphere are we located on?
     HemisphereType hemisphere;
 
-
-    void removeAstrometryOption(QStringList &solver_args,QString option);
-    void editAstrometryOption(QStringList &solver_args, QString option, QString argument);
+    // Astrometry Options
+    OpsAstrometry *opsAstrometry;
+    OpsAlign *opsAlign;
 };
 
 }
diff --git a/kstars/ekos/align/align.ui b/kstars/ekos/align/align.ui
index fb4eca2d6..0649103b8 100644
--- a/kstars/ekos/align/align.ui
+++ b/kstars/ekos/align/align.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>576</width>
-    <height>491</height>
+    <width>600</width>
+    <height>468</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout_11">
@@ -493,25 +493,6 @@
                 </property>
                </widget>
               </item>
-              <item row="1" column="1" colspan="2">
-               <widget class="QDoubleSpinBox" name="exposureIN">
-                <property name="toolTip">
-                 <string>Exposure duration in seconds</string>
-                </property>
-                <property name="minimum">
-                 <double>0.100000000000000</double>
-                </property>
-                <property name="maximum">
-                 <double>60.000000000000000</double>
-                </property>
-                <property name="singleStep">
-                 <double>0.500000000000000</double>
-                </property>
-                <property name="value">
-                 <double>3.000000000000000</double>
-                </property>
-               </widget>
-              </item>
               <item row="2" column="1" colspan="2">
                <widget class="QComboBox" name="binningCombo">
                 <property name="toolTip">
@@ -519,50 +500,6 @@
                 </property>
                </widget>
               </item>
-              <item row="3" column="7">
-               <widget class="QPushButton" name="clearBoxesB">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
-                <property name="minimumSize">
-                 <size>
-                  <width>22</width>
-                  <height>22</height>
-                 </size>
-                </property>
-                <property name="maximumSize">
-                 <size>
-                  <width>22</width>
-                  <height>22</height>
-                 </size>
-                </property>
-                <property name="toolTip">
-                 <string>Clear RA & DEC values and reset solver options</string>
-                </property>
-                <property name="text">
-                 <string/>
-                </property>
-                <property name="iconSize">
-                 <size>
-                  <width>22</width>
-                  <height>22</height>
-                 </size>
-                </property>
-               </widget>
-              </item>
-              <item row="3" column="0">
-               <widget class="QLabel" name="label_15">
-                <property name="toolTip">
-                 <string>estimated RA of target center to limit the solver's search area</string>
-                </property>
-                <property name="text">
-                 <string>RA:</string>
-                </property>
-               </widget>
-              </item>
               <item row="1" column="0">
                <widget class="QLabel" name="label_7">
                 <property name="toolTip">
@@ -573,30 +510,25 @@
                 </property>
                </widget>
               </item>
-              <item row="2" column="0">
-               <widget class="QLabel" name="label_18">
+              <item row="0" column="1" colspan="3">
+               <widget class="QComboBox" name="CCDCaptureCombo"/>
+              </item>
+              <item row="1" column="1" colspan="2">
+               <widget class="QDoubleSpinBox" name="exposureIN">
                 <property name="toolTip">
-                 <string/>
+                 <string>Exposure duration in seconds</string>
                 </property>
-                <property name="text">
-                 <string>Bin:</string>
+                <property name="minimum">
+                 <double>0.100000000000000</double>
                 </property>
-               </widget>
-              </item>
-              <item row="3" column="2">
-               <widget class="QLabel" name="label_16">
-                <property name="toolTip">
-                 <string>estimated DEC of target center to limit the solver's search area</string>
+                <property name="maximum">
+                 <double>60.000000000000000</double>
                 </property>
-                <property name="text">
-                 <string>DE:</string>
+                <property name="singleStep">
+                 <double>0.500000000000000</double>
                 </property>
-               </widget>
-              </item>
-              <item row="3" column="3">
-               <widget class="dmsBox" name="decBox">
-                <property name="toolTip">
-                 <string/>
+                <property name="value">
+                 <double>3.000000000000000</double>
                 </property>
                </widget>
               </item>
@@ -610,35 +542,13 @@
                 </property>
                </widget>
               </item>
-              <item row="0" column="1" colspan="3">
-               <widget class="QComboBox" name="CCDCaptureCombo"/>
-              </item>
-              <item row="0" column="7">
-               <widget class="QPushButton" name="showFITSViewerB">
-                <property name="minimumSize">
-                 <size>
-                  <width>22</width>
-                  <height>22</height>
-                 </size>
-                </property>
-                <property name="maximumSize">
-                 <size>
-                  <width>22</width>
-                  <height>22</height>
-                 </size>
-                </property>
+              <item row="2" column="0">
+               <widget class="QLabel" name="label_18">
                 <property name="toolTip">
-                 <string>Show in FITS Viewer</string>
-                </property>
-                <property name="text">
                  <string/>
                 </property>
-               </widget>
-              </item>
-              <item row="3" column="1">
-               <widget class="dmsBox" name="raBox">
-                <property name="toolTip">
-                 <string/>
+                <property name="text">
+                 <string>Bin:</string>
                 </property>
                </widget>
               </item>
@@ -664,14 +574,8 @@
                 </property>
                </widget>
               </item>
-              <item row="2" column="7">
-               <widget class="QPushButton" name="syncBoxesB">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
+              <item row="0" column="7">
+               <widget class="QPushButton" name="showFITSViewerB">
                 <property name="minimumSize">
                  <size>
                   <width>22</width>
@@ -685,17 +589,11 @@
                  </size>
                 </property>
                 <property name="toolTip">
-                 <string>Fill RA &amp; DEC values from telescope coordinates and update options</string>
+                 <string>Show in FITS Viewer</string>
                 </property>
                 <property name="text">
                  <string/>
                 </property>
-                <property name="iconSize">
-                 <size>
-                  <width>22</width>
-                  <height>22</height>
-                 </size>
-                </property>
                </widget>
               </item>
              </layout>
@@ -719,6 +617,9 @@
               <property name="statusTip">
                <string>Additional options to be the solver</string>
               </property>
+              <property name="readOnly">
+               <bool>false</bool>
+              </property>
              </widget>
             </item>
             <item>
@@ -1633,14 +1534,6 @@
    </item>
   </layout>
  </widget>
- <customwidgets>
-  <customwidget>
-   <class>dmsBox</class>
-   <extends>QLineEdit</extends>
-   <header>widgets/dmsbox.h</header>
-   <container>1</container>
-  </customwidget>
- </customwidgets>
  <tabstops>
   <tabstop>solveB</tabstop>
   <tabstop>loadSlewB</tabstop>
@@ -1663,9 +1556,6 @@
   <tabstop>alignDarkFrameCheck</tabstop>
   <tabstop>toggleFullScreenB</tabstop>
   <tabstop>binningCombo</tabstop>
-  <tabstop>raBox</tabstop>
-  <tabstop>decBox</tabstop>
-  <tabstop>clearBoxesB</tabstop>
   <tabstop>solverOptions</tabstop>
   <tabstop>onlineSolverR</tabstop>
   <tabstop>offlineSolverR</tabstop>
diff --git a/kstars/ekos/align/astrometryoptions.ui b/kstars/ekos/align/astrometryoptions.ui
deleted file mode 100644
index 16f1c2790..000000000
--- a/kstars/ekos/align/astrometryoptions.ui
+++ /dev/null
@@ -1,696 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>astrometryoptions</class>
- <widget class="QDialog" name="astrometryoptions">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>740</width>
-    <height>326</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Astrometry Options Editor</string>
-  </property>
-  <property name="toolTip">
-   <string><html><head/><body><p>The DEC of the Estimated Telescope/Image Field Position in dd:mm:ss notation</p></body></html></string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QGroupBox" name="groupBox_3">
-     <property name="title">
-      <string>Basic Options</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_2">
-      <item>
-       <layout class="QHBoxLayout" name="horizontalLayout_5">
-        <property name="topMargin">
-         <number>0</number>
-        </property>
-        <item>
-         <widget class="QCheckBox" name="checkFits2Fits">
-          <property name="toolTip">
-           <string><html><head/><body><p>This option should <span style=" font-weight:600;">ONLY</span> be checked if your astrometry.net version is 0.67 or earlier. Uncheck for any versions greater than 0.67</p></body></html></string>
-          </property>
-          <property name="text">
-           <string>--no-fits2fits</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkResort">
-          <property name="toolTip">
-           <string><html><head/><body><p>Check this option if your image does not have much nebulosity. If it does have strong nebulosity, uncheck it.</p></body></html></string>
-          </property>
-          <property name="text">
-           <string>--resort</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkVerify">
-          <property name="toolTip">
-           <string><html><head/><body><p>This will prevent the solver from looking at an already existing WCS Header before blindly trying to solve the image. It is recommended to keep it checked.</p></body></html></string>
-          </property>
-          <property name="text">
-           <string>--no-verify</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkBox_27">
-          <property name="enabled">
-           <bool>false</bool>
-          </property>
-          <property name="toolTip">
-           <string><html><head/><body><p>Prevents creation of unnecessary files unused by Ekos.</p></body></html></string>
-          </property>
-          <property name="text">
-           <string>--no-plots</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkBox_30">
-          <property name="enabled">
-           <bool>false</bool>
-          </property>
-          <property name="maximumSize">
-           <size>
-            <width>50</width>
-            <height>16777215</height>
-           </size>
-          </property>
-          <property name="toolTip">
-           <string><html><head/><body><p>Overwrite already generated files. It must be checked to prevent solver failure.</p></body></html></string>
-          </property>
-          <property name="text">
-           <string>-O</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="Line" name="line">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_4">
-     <property name="topMargin">
-      <number>10</number>
-     </property>
-     <item>
-      <widget class="QGroupBox" name="groupBox">
-       <property name="title">
-        <string>Imaging Options</string>
-       </property>
-       <layout class="QGridLayout" name="gridLayout">
-        <item row="2" column="1">
-         <layout class="QHBoxLayout" name="horizontalLayout_17">
-          <property name="topMargin">
-           <number>0</number>
-          </property>
-          <item>
-           <widget class="QLineEdit" name="lineEdit_55">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="minimumSize">
-             <size>
-              <width>100</width>
-              <height>0</height>
-             </size>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>100</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>Downsample the image to shrink its size and speed up the solver.</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>downsample</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QLineEdit" name="downSampleValue">
-            <property name="minimumSize">
-             <size>
-              <width>70</width>
-              <height>0</height>
-             </size>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>70</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>Downsample factor</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>2</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </item>
-        <item row="2" column="0">
-         <widget class="QCheckBox" name="checkDownSample">
-          <property name="toolTip">
-           <string><html><head/><body><p>Downsample the image to shrink its size and speed up the solver.</p></body></html></string>
-          </property>
-          <property name="text">
-           <string>Down Sample Image</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="0" column="0">
-         <widget class="QCheckBox" name="checkScale">
-          <property name="toolTip">
-           <string><html><head/><body><p>Set image scale to speed up solver as it does not have to search index files of different image scales.</p></body></html></string>
-          </property>
-          <property name="text">
-           <string>Image Scale Bounds</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="0" column="1">
-         <layout class="QGridLayout" name="gridLayout_8">
-          <property name="leftMargin">
-           <number>0</number>
-          </property>
-          <property name="topMargin">
-           <number>0</number>
-          </property>
-          <item row="1" column="2">
-           <widget class="QLineEdit" name="scaleH">
-            <property name="minimumSize">
-             <size>
-              <width>70</width>
-              <height>0</height>
-             </size>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>70</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The high end of the imager scale, calculated as a little bigger than the longer dimension of the image.</p></body></html></string>
-            </property>
-           </widget>
-          </item>
-          <item row="1" column="0">
-           <widget class="QLabel" name="label_13">
-            <property name="toolTip">
-             <string><html><head/><body><p>The high end of the imager scale, calculated as a little bigger than the longer dimension of the image.</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>High</string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="0">
-           <widget class="QLabel" name="label_12">
-            <property name="toolTip">
-             <string><html><head/><body><p>The lower end of the imager scale, calculated as a little smaller than the shorter dimension of the image.</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>Low</string>
-            </property>
-           </widget>
-          </item>
-          <item row="1" column="1">
-           <widget class="QLineEdit" name="lineEdit_42">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>30</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The high end of the imager scale, calculated as a little bigger than the longer dimension of the image.</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>H</string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="1">
-           <widget class="QLineEdit" name="lineEdit_41">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>30</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The lower end of the imager scale, calculated as a little smaller than the shorter dimension of the image.</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>L</string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="2">
-           <widget class="QLineEdit" name="scaleL">
-            <property name="minimumSize">
-             <size>
-              <width>70</width>
-              <height>0</height>
-             </size>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>70</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The lower end of the imager scale, calculated as a little smaller than the shorter dimension of the image.</p></body></html></string>
-            </property>
-           </widget>
-          </item>
-          <item row="2" column="1">
-           <widget class="QLineEdit" name="lineEdit_50">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>30</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The units of the imager scale bounds above.</p><p>dw: degree width</p><p>aw: arcminute width</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>u</string>
-            </property>
-           </widget>
-          </item>
-          <item row="2" column="0">
-           <widget class="QLabel" name="label_7">
-            <property name="toolTip">
-             <string><html><head/><body><p>The units of the imager scale bounds above.</p><p>dw: degree width</p><p>aw: arcminute width</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>units</string>
-            </property>
-           </widget>
-          </item>
-          <item row="2" column="2">
-           <widget class="QComboBox" name="unitSelector">
-            <property name="maximumSize">
-             <size>
-              <width>110</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The units of the imager scale bounds above.</p><p>dw: degree width</p><p>aw: arcminute width</p></body></html></string>
-            </property>
-            <property name="currentIndex">
-             <number>0</number>
-            </property>
-            <item>
-             <property name="text">
-              <string>dw</string>
-             </property>
-            </item>
-            <item>
-             <property name="text">
-              <string>aw</string>
-             </property>
-            </item>
-           </widget>
-          </item>
-         </layout>
-        </item>
-        <item row="0" column="2">
-         <widget class="QPushButton" name="updateScale">
-          <property name="minimumSize">
-           <size>
-            <width>22</width>
-            <height>22</height>
-           </size>
-          </property>
-          <property name="maximumSize">
-           <size>
-            <width>22</width>
-            <height>22</height>
-           </size>
-          </property>
-          <property name="toolTip">
-           <string><html><head/><body><p>Update Image Scale Bounds from the currently active camera &amp; telescope combination.</p></body></html></string>
-          </property>
-          <property name="text">
-           <string/>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-     </item>
-     <item>
-      <spacer name="horizontalSpacer">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QGroupBox" name="groupBox_2">
-       <property name="title">
-        <string>Position Options</string>
-       </property>
-       <layout class="QGridLayout" name="gridLayout_2">
-        <item row="0" column="1">
-         <layout class="QGridLayout" name="gridLayout_9">
-          <property name="leftMargin">
-           <number>0</number>
-          </property>
-          <property name="topMargin">
-           <number>0</number>
-          </property>
-          <item row="0" column="1">
-           <widget class="QLineEdit" name="lineEdit_47">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>30</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The RA of the Estimated Telescope/Image Field Position in hh:mm:ss notation</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>3</string>
-            </property>
-           </widget>
-          </item>
-          <item row="1" column="0">
-           <widget class="QLabel" name="label_15">
-            <property name="toolTip">
-             <string><html><head/><body><p>The DEC of the Estimated Telescope/Image Field Position in dd:mm:ss notation</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>DEC</string>
-            </property>
-           </widget>
-          </item>
-          <item row="1" column="1">
-           <widget class="QLineEdit" name="lineEdit_48">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>30</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The DEC of the Estimated Telescope/Image Field Position in dd:mm:ss notation</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>4</string>
-            </property>
-           </widget>
-          </item>
-          <item row="1" column="2">
-           <widget class="dmsBox" name="estDec">
-            <property name="enabled">
-             <bool>true</bool>
-            </property>
-            <property name="minimumSize">
-             <size>
-              <width>70</width>
-              <height>0</height>
-             </size>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>70</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The DEC of the Estimated Telescope/Image Field Position in dd:mm:ss notation</p></body></html></string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="0">
-           <widget class="QLabel" name="label_14">
-            <property name="toolTip">
-             <string><html><head/><body><p>The RA of the Estimated Telescope/Image Field Position in hh:mm:ss notation</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>RA</string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="2">
-           <widget class="dmsBox" name="estRA">
-            <property name="enabled">
-             <bool>true</bool>
-            </property>
-            <property name="minimumSize">
-             <size>
-              <width>70</width>
-              <height>0</height>
-             </size>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>70</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The RA of the Estimated Telescope/Image Field Position in hh:mm:ss notation</p></body></html></string>
-            </property>
-           </widget>
-          </item>
-          <item row="2" column="2">
-           <widget class="QLineEdit" name="estRadius">
-            <property name="minimumSize">
-             <size>
-              <width>70</width>
-              <height>0</height>
-             </size>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>70</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The Search Radius for the Estimated Telescope/Image Field Position in degrees.</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>30</string>
-            </property>
-           </widget>
-          </item>
-          <item row="2" column="1">
-           <widget class="QLineEdit" name="lineEdit_44">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>30</width>
-              <height>16777215</height>
-             </size>
-            </property>
-            <property name="toolTip">
-             <string><html><head/><body><p>The Search Radius for the Estimated Telescope/Image Field Position in degrees.</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>5</string>
-            </property>
-           </widget>
-          </item>
-          <item row="2" column="0">
-           <widget class="QLabel" name="label_8">
-            <property name="toolTip">
-             <string><html><head/><body><p>The Search Radius for the Estimated Telescope/Image Field Position in degrees.</p></body></html></string>
-            </property>
-            <property name="text">
-             <string>Radius</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </item>
-        <item row="0" column="0">
-         <widget class="QCheckBox" name="checkPosition">
-          <property name="toolTip">
-           <string><html><head/><body><p>Set estimated position to speed up astrometry solver as it does not have to search in other areas of the sky.</p></body></html></string>
-          </property>
-          <property name="text">
-           <string>Estimated
-Position</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="2" column="1">
-         <widget class="QLabel" name="label">
-          <property name="text">
-           <string/>
-          </property>
-         </widget>
-        </item>
-        <item row="0" column="2">
-         <widget class="QPushButton" name="updatePosition">
-          <property name="minimumSize">
-           <size>
-            <width>22</width>
-            <height>22</height>
-           </size>
-          </property>
-          <property name="maximumSize">
-           <size>
-            <width>22</width>
-            <height>22</height>
-           </size>
-          </property>
-          <property name="toolTip">
-           <string><html><head/><body><p>Update coordinates to the current telescope position</p></body></html></string>
-          </property>
-          <property name="text">
-           <string/>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <widget class="QLineEdit" name="solverOptions">
-     <property name="toolTip">
-      <string><html><head/><body><p>You can directly enter the Solver Arguments on this line.  If the argument is recognized, it will automatically update the boxes above as you type.  You can also enter options that are not included above.</p></body></html></string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset|QDialogButtonBox::RestoreDefaults</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>dmsBox</class>
-   <extends>QLineEdit</extends>
-   <header>widgets/dmsbox.h</header>
-   <container>1</container>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>astrometryoptions</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>414</x>
-     <y>309</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>414</x>
-     <y>164</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>astrometryoptions</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>414</x>
-     <y>309</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>414</x>
-     <y>164</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/kstars/ekos/align/offlineastrometryparser.cpp b/kstars/ekos/align/offlineastrometryparser.cpp
index 225e731a0..6096d43f5 100644
--- a/kstars/ekos/align/offlineastrometryparser.cpp
+++ b/kstars/ekos/align/offlineastrometryparser.cpp
@@ -87,11 +87,12 @@ bool OfflineAstrometryParser::astrometryNetOK()
         solverOK = solver.exists() && solver.isFile();
     }
     else{
-        QFileInfo solver(Options::astrometrySolver());
+        QFileInfo solver(Options::astrometrySolverBinary());
         solverOK = solver.exists() && solver.isFile();
     }
 
-    if(Options::wcsIsInternal()){
+    if(Options::astrometryWCSIsInternal())
+    {
         QFileInfo wcsinfo(QCoreApplication::applicationDirPath()+"/astrometry/bin/wcsinfo");
         wcsinfoOK  = wcsinfo.exists() && wcsinfo.isFile();
     }else{
@@ -210,7 +211,7 @@ bool OfflineAstrometryParser::startSovler(const QString &filename,  const QStrin
 
     QStringList solverArgs = args;
     // Add parity option if none is give and we already know parity before
-    if (parity.isEmpty() == false && args.contains("parity") == false)
+    if (Options::astrometryDetectParity() && parity.isEmpty() == false && args.contains("parity") == false)
         solverArgs << "--parity" << parity;
     QString solutionFile = QDir::tempPath() + "/solution.wcs";
     solverArgs << "-W" <<  solutionFile << filename;
@@ -240,13 +241,13 @@ bool OfflineAstrometryParser::startSovler(const QString &filename,  const QStrin
     if(Options::astrometrySolverIsInternal())
         solverPath=QCoreApplication::applicationDirPath()+"/astrometry/bin/solve-field";
     else
-        solverPath=Options::astrometrySolver();
+        solverPath=Options::astrometrySolverBinary();
 
     solver.start(solverPath, solverArgs);
 
     align->appendLogText(i18n("Starting solver..."));
 
-    if (Options::solverVerbose())
+    if (Options::astrometrySolverVerbose())
     {
         QString command = solverPath + " " + solverArgs.join(" ");
         align->appendLogText(command);
@@ -283,7 +284,7 @@ void OfflineAstrometryParser::solverComplete(int exist_status)
 
     QString wcsPath;
 
-    if(Options::wcsIsInternal())
+    if(Options::astrometryWCSIsInternal())
         wcsPath = QCoreApplication::applicationDirPath()+"/astrometry/bin/wcsinfo";
     else
         wcsPath = Options::astrometryWCSInfo();
@@ -339,7 +340,7 @@ void OfflineAstrometryParser::wcsinfoComplete(int exist_status)
 
 void OfflineAstrometryParser::logSolver()
 {
-    if (Options::solverVerbose())
+    if (Options::astrometrySolverVerbose())
         align->appendLogText(solver.readAll().trimmed());
 }
 
diff --git a/kstars/ekos/align/onlineastrometryparser.cpp b/kstars/ekos/align/onlineastrometryparser.cpp
index 3253b0fb9..885cd020e 100644
--- a/kstars/ekos/align/onlineastrometryparser.cpp
+++ b/kstars/ekos/align/onlineastrometryparser.cpp
@@ -202,7 +202,7 @@ void OnlineAstrometryParser::uploadFile()
     uploadReq.insert("radius", radius);
     if (downsample_factor != 0)
         uploadReq.insert("downsample_factor", downsample_factor);
-    if (parity != -1)
+    if (Options::astrometryDetectParity() && parity != -1)
         uploadReq.insert("parity", parity);
 
     QJsonObject json = QJsonObject::fromVariantMap(uploadReq);
@@ -311,7 +311,7 @@ void OnlineAstrometryParser::onResult(QNetworkReply* reply)
      QVariant json_result = json_doc.toVariant();
      QVariantMap result = json_result.toMap();
 
-     if (Options::solverVerbose())
+     if (Options::astrometrySolverVerbose())
          align->appendLogText(json_doc.toJson(QJsonDocument::Compact));
 
      switch (workflowStage)
@@ -327,7 +327,7 @@ void OnlineAstrometryParser::onResult(QNetworkReply* reply)
 
          sessionKey = result["session"].toString();
 
-         if (Options::solverVerbose())
+         if (Options::astrometrySolverVerbose())
             align->appendLogText(i18n("Authentication to astrometry.net is successful. Session: %1", sessionKey));
 
          emit authenticateFinished();
diff --git a/kstars/ekos/align/opsalign.cpp b/kstars/ekos/align/opsalign.cpp
new file mode 100644
index 000000000..afff82e23
--- /dev/null
+++ b/kstars/ekos/align/opsalign.cpp
@@ -0,0 +1,91 @@
+/*  Astrometry.net Options Editor
+    Copyright (C) 2017 Jasem Mutlaq <mutlaqja at ikarustech.com>
+    Copyright (C) 2017 Robert Lancaster <rlancaste at gmail.com>
+
+    This application is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+*/
+
+#include <KConfigDialog>
+
+#include "fov.h"
+#include "opsalign.h"
+#include "kstars.h"
+#include "align.h"
+#include "Options.h"
+
+namespace Ekos
+{
+
+OpsAlign::OpsAlign(Align *parent)  : QWidget( KStars::Instance() )
+{
+    setupUi(this);
+
+    alignModule = parent;
+
+    //Get a pointer to the KConfigDialog
+    m_ConfigDialog = KConfigDialog::exists( "alignsettings" );
+
+    connect( m_ConfigDialog->button(QDialogButtonBox::Apply), SIGNAL( clicked() ), SLOT( slotApply() ) );
+    connect( m_ConfigDialog->button(QDialogButtonBox::Ok), SIGNAL( clicked() ), SLOT( slotApply() ) );
+
+#ifdef Q_OS_OSX
+connect(kcfg_AstrometrySolverIsInternal, SIGNAL(clicked()), this, SLOT(toggleSolverInternal()));
+kcfg_AstrometrySolverIsInternal->setToolTip(i18n("Internal or External Plate Solver?"));
+if(Options::astrometrySolverIsInternal())
+    kcfg_AstrometrySolverBinary->setEnabled(false);
+
+connect(kcfg_AstrometryConfFileIsInternal, SIGNAL(clicked()), this, SLOT(toggleConfigInternal()));
+kcfg_AstrometryConfFileIsInternal->setToolTip(i18n("Internal or External astrometry.cfg?"));
+if(Options::astrometryConfFileIsInternal())
+    kcfg_AstrometryConfFile->setEnabled(false);
+
+connect(kcfg_wcsIsInternal, SIGNAL(clicked()), this, SLOT(toggleWCSInternal()));
+kcfg_AstrometryWCSIsInternal->setToolTip(i18n("Internal or External wcsinfo?"));
+if(Options::wcsIsInternal())
+    kcfg_AstrometryWCSInfo->setEnabled(false);
+#else
+kcfg_AstrometrySolverIsInternal->setVisible(false);
+kcfg_AstrometryConfFileIsInternal->setVisible(false);
+kcfg_AstrometryWCSIsInternal->setVisible(false);
+#endif
+}
+
+OpsAlign::~OpsAlign() {}
+
+void OpsAlign::toggleSolverInternal()
+{
+    kcfg_AstrometrySolverBinary->setEnabled(!kcfg_AstrometrySolverIsInternal->isChecked());
+    if(kcfg_AstrometrySolverIsInternal->isChecked())
+        kcfg_AstrometrySolverBinary->setText("*Internal Solver*");
+    else
+        kcfg_AstrometrySolverBinary->setText("/usr/local/bin/solve-field");
+}
+
+void OpsAlign::toggleConfigInternal()
+{
+    kcfg_AstrometryConfFile->setEnabled(!kcfg_AstrometryConfFileIsInternal->isChecked());
+    if(kcfg_AstrometryConfFileIsInternal->isChecked())
+        kcfg_AstrometryConfFile->setText("*Internal astrometry.cfg*");
+    else
+        kcfg_AstrometryConfFile->setText("/etc/astrometry.cfg");
+}
+
+void OpsAlign::toggleWCSInternal()
+{
+    kcfg_AstrometryWCSInfo->setEnabled(!kcfg_AstrometryWCSIsInternal->isChecked());
+    if(kcfg_AstrometryWCSIsInternal->isChecked())
+        kcfg_AstrometryWCSInfo->setText("*Internal wcsinfo*");
+    else
+        kcfg_AstrometryWCSInfo->setText("/usr/local/bin/wcsinfo");
+}
+
+void OpsAlign::slotApply()
+{
+    if (alignModule->fov())
+            alignModule->fov()->setImageDisplay(kcfg_AstrometrySolverWCS->isChecked());
+}
+
+}
diff --git a/kstars/ekos/align/opsalign.h b/kstars/ekos/align/opsalign.h
new file mode 100644
index 000000000..b365fccb3
--- /dev/null
+++ b/kstars/ekos/align/opsalign.h
@@ -0,0 +1,48 @@
+/*  Astrometry.net Options Editor
+    Copyright (C) 2017 Jasem Mutlaq <mutlaqja at ikarustech.com>
+    Copyright (C) 2017 Robert Lancaster <rlancaste at gmail.com>
+
+    This application is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+*/
+
+#ifndef OPSALIGN_H
+#define OPSALIGN_H
+
+#include <QWidget>
+
+#include "ui_opsalign.h"
+
+class KConfigDialog;
+
+namespace Ekos
+{
+
+class Align;
+
+class OpsAlign : public QWidget, public Ui::OpsAlign
+{
+    Q_OBJECT
+
+public:
+    explicit OpsAlign(Align *parent);
+    ~OpsAlign();
+
+protected:
+
+private slots:
+    void toggleSolverInternal();
+    void toggleConfigInternal();
+    void toggleWCSInternal();
+    void slotApply();
+
+private:
+    KConfigDialog *m_ConfigDialog;
+    Align *alignModule;
+};
+
+}
+
+#endif // OpsAlign_H
diff --git a/kstars/ekos/align/opsalign.ui b/kstars/ekos/align/opsalign.ui
new file mode 100644
index 000000000..bed648a88
--- /dev/null
+++ b/kstars/ekos/align/opsalign.ui
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OpsAlign</class>
+ <widget class="QWidget" name="OpsAlign">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>422</width>
+    <height>124</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QGridLayout" name="gridLayout">
+     <item row="0" column="2">
+      <widget class="QLineEdit" name="kcfg_AstrometrySolverBinary">
+       <property name="toolTip">
+        <string>Astrometry.net solve-field binary</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="5">
+      <widget class="QLineEdit" name="kcfg_AstrometryAPIKey">
+       <property name="toolTip">
+        <string>Astrometry.net configuration file</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="3">
+      <widget class="QCheckBox" name="kcfg_AstrometryWCSIsInternal">
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="4">
+      <widget class="QLabel" name="label_17">
+       <property name="text">
+        <string>API Key:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="2">
+      <widget class="QLineEdit" name="kcfg_AstrometryConfFile">
+       <property name="toolTip">
+        <string>Astrometry.net configuration file</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QLabel" name="label_14">
+       <property name="text">
+        <string>config:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="QLabel" name="label_18">
+       <property name="text">
+        <string>API URL:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="5">
+      <widget class="QLineEdit" name="kcfg_AstrometryWCSInfo">
+       <property name="toolTip">
+        <string>Astrometry.net wcsinfo binary</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QCheckBox" name="kcfg_AstrometryConfFileIsInternal">
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QLabel" name="label_15">
+       <property name="text">
+        <string>solver:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="4">
+      <widget class="QLabel" name="label_16">
+       <property name="text">
+        <string>wcsinfo:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="2">
+      <widget class="QLineEdit" name="kcfg_AstrometryAPIURL">
+       <property name="toolTip">
+        <string>Astrometry.net configuration file</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="0">
+      <widget class="QCheckBox" name="kcfg_AstrometrySolverIsInternal">
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="4" colspan="2">
+      <widget class="QCheckBox" name="kcfg_AstrometryUseJPEG">
+       <property name="toolTip">
+        <string>Use JPEG format, instead of FITS, to upload images to the online astrometry.net service</string>
+       </property>
+       <property name="text">
+        <string>Upload JPG</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_5">
+     <item>
+      <widget class="QCheckBox" name="kcfg_AstrometrySolverWCS">
+       <property name="toolTip">
+        <string>enable World Coordinate System (WCS). WCS is used to encode RA/DEC coordinates in captured CCD images.</string>
+       </property>
+       <property name="text">
+        <string>WCS</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="kcfg_AstrometrySolverVerbose">
+       <property name="toolTip">
+        <string>Log verbose solver output</string>
+       </property>
+       <property name="statusTip">
+        <string/>
+       </property>
+       <property name="text">
+        <string>Verbose</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="kcfg_AstrometrySolverOverlay">
+       <property name="toolTip">
+        <string>Display received FITS images unto solver FOV rectangle in the sky map</string>
+       </property>
+       <property name="text">
+        <string>Overlay</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_4">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="verticalSpacer_6">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>3</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/kstars/ekos/align/opsastrometry.cpp b/kstars/ekos/align/opsastrometry.cpp
new file mode 100644
index 000000000..e9768df83
--- /dev/null
+++ b/kstars/ekos/align/opsastrometry.cpp
@@ -0,0 +1,156 @@
+/*  Astrometry.net Options Editor
+    Copyright (C) 2017 Jasem Mutlaq <mutlaqja at ikarustech.com>
+    Copyright (C) 2017 Robert Lancaster <rlancaste at gmail.com>
+
+    This application is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+*/
+
+#include <KConfigDialog>
+
+#include "opsastrometry.h"
+#include "kstars.h"
+#include "align.h"
+#include "Options.h"
+
+namespace Ekos
+{
+
+OpsAstrometry::OpsAstrometry(Align *parent)  : QWidget( KStars::Instance() )
+{
+    setupUi(this);
+
+    alignModule = parent;
+
+    //Get a pointer to the KConfigDialog
+    m_ConfigDialog = KConfigDialog::exists( "alignsettings" );
+
+    dms ra, de;
+    ra.setD(Options::astrometryPositionRA());
+    de.setD(Options::astrometryPositionDE());
+
+    estRA->setText(ra.toHMSString());
+    estDec->setText(de.toDMSString());
+
+    imageWarningLabel->setHidden(kcfg_AstrometryAutoUpdateImageScale->isChecked());
+    positionWarningLabel->setHidden(kcfg_AstrometryAutoUpdatePosition->isChecked());
+
+    connect(kcfg_AstrometryAutoUpdateImageScale, SIGNAL(toggled(bool)), imageWarningLabel, SLOT(setHidden(bool)));
+    connect(kcfg_AstrometryAutoUpdatePosition, SIGNAL(toggled(bool)), positionWarningLabel, SLOT(setHidden(bool)));
+
+    connect( m_ConfigDialog->button(QDialogButtonBox::Apply), SIGNAL( clicked() ), SLOT( slotApply() ) );
+    connect( m_ConfigDialog->button(QDialogButtonBox::Ok), SIGNAL( clicked() ), SLOT( slotApply() ) );
+
+    connect(updateScale, SIGNAL(clicked()), this, SLOT(slotUpdateScale()));
+    connect(updatePosition, SIGNAL(clicked()), this, SLOT(slotUpdatePosition()));
+    updateScale->setIcon(QIcon::fromTheme("edit-copy", QIcon(":/icons/breeze/default/edit-copy.svg")));
+    updateScale->setAttribute(Qt::WA_LayoutUsesWidgetRect);
+    updatePosition->setIcon(QIcon::fromTheme("edit-copy", QIcon(":/icons/breeze/default/edit-copy.svg")));
+    updatePosition->setAttribute(Qt::WA_LayoutUsesWidgetRect);
+}
+
+OpsAstrometry::~OpsAstrometry() {}
+
+void OpsAstrometry::showEvent(QShowEvent *)
+{
+    dms ra, de;
+    ra.setD(Options::astrometryPositionRA());
+    de.setD(Options::astrometryPositionDE());
+
+    estRA->setText(ra.toHMSString());
+    estDec->setText(de.toDMSString());
+}
+
+//This updates the telescope/image field scale in the astrometry options editor to match the currently connected devices.
+void OpsAstrometry::slotUpdateScale()
+{
+    double fov_w, fov_h, fov_pixscale;
+
+    // Values in arcmins. Scale in arcsec per pixel
+    alignModule->getFOVScale(fov_w, fov_h, fov_pixscale);
+
+    switch (kcfg_AstrometryImageScaleUnits->currentIndex())
+    {
+    case SCALE_DEGREES:
+        fov_w /= 60;
+        fov_h /= 60;
+        kcfg_AstrometryImageScaleLow->setValue(qMin(fov_w, fov_h));
+        kcfg_AstrometryImageScaleHigh->setValue(qMax(fov_w, fov_h));
+        break;
+
+    case SCALE_ARCMINUTES:
+        kcfg_AstrometryImageScaleLow->setValue(qMin(fov_w, fov_h));
+        kcfg_AstrometryImageScaleHigh->setValue(qMax(fov_w, fov_h));
+        break;
+
+    case SCALE_ARCSECPERPIX:
+        kcfg_AstrometryImageScaleLow->setValue(fov_pixscale);
+        kcfg_AstrometryImageScaleHigh->setValue(fov_pixscale);
+        break;
+
+    default:
+        return;
+    }
+}
+
+//This updates the RA and DEC position in the astrometry options editor to match the current telescope position.
+void OpsAstrometry::slotUpdatePosition()
+{
+    estRA->setText(alignModule->ScopeRAOut->text());
+    estDec->setText(alignModule->ScopeDecOut->text());
+}
+
+void OpsAstrometry::slotApply()
+{
+    bool raOK=false, deOK=false;
+    dms RA = estRA->createDms(false, &raOK);
+    dms DE = estDec->createDms(true, &deOK);
+
+    if (raOK && deOK)
+    {
+        Options::setAstrometryPositionRA(RA.Degrees());
+        Options::setAstrometryPositionDE(DE.Degrees());
+    }
+
+    QVariantMap optionsMap;
+
+    if (kcfg_AstrometryUseNoVerify->isChecked())
+        optionsMap["noverify"] = true;
+
+    if (kcfg_AstrometryUseResort->isChecked())
+        optionsMap["resort"] = true;
+
+    if (kcfg_AstrometryUseNoFITS2FITS->isChecked())
+        optionsMap["nofits2fits"] = true;
+
+    if (kcfg_AstrometryUseImageScale->isChecked())
+    {
+        optionsMap["scaleL"] = kcfg_AstrometryImageScaleLow->value();
+        optionsMap["scaleH"] = kcfg_AstrometryImageScaleHigh->value();
+        optionsMap["scaleUnits"] = kcfg_AstrometryImageScaleUnits->currentText();
+    }
+
+    if (kcfg_AstrometryUsePosition->isChecked())
+    {
+        optionsMap["ra"] = RA.Degrees();
+        optionsMap["de"] = DE.Degrees();
+        optionsMap["radius"] = kcfg_AstrometryRaduis->value();
+    }
+
+    if (kcfg_AstrometryUseDownsample->isChecked())
+        optionsMap["downsample"] = kcfg_AstrometryDownsample->value();
+
+    if (kcfg_AstrometryCustomOptions->text().isEmpty() == false)
+        optionsMap["custom"] = kcfg_AstrometryCustomOptions->text();
+
+
+    QStringList solverArgs = Align::generateOptions(optionsMap);
+
+    QString options = solverArgs.join(" ");
+    alignModule->solverOptions->setText(options);
+    alignModule->solverOptions->setToolTip(options);
+}
+
+}
diff --git a/kstars/ekos/align/opsastrometry.h b/kstars/ekos/align/opsastrometry.h
new file mode 100644
index 000000000..cec37c8cb
--- /dev/null
+++ b/kstars/ekos/align/opsastrometry.h
@@ -0,0 +1,51 @@
+/*  Astrometry.net Options Editor
+    Copyright (C) 2017 Jasem Mutlaq <mutlaqja at ikarustech.com>
+    Copyright (C) 2017 Robert Lancaster <rlancaste at gmail.com>
+
+    This application is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+*/
+
+#ifndef OPSASTROMETRY_H
+#define OPSASTROMETRY_H
+
+#include <QWidget>
+
+#include "ui_opsastrometry.h"
+
+class KConfigDialog;
+
+namespace Ekos
+{
+
+class Align;
+
+class OpsAstrometry : public QWidget, public Ui::OpsAstrometry
+{
+    Q_OBJECT
+
+public:
+
+    enum { SCALE_DEGREES, SCALE_ARCMINUTES, SCALE_ARCSECPERPIX };
+
+    explicit OpsAstrometry(Align *parent);
+    ~OpsAstrometry();
+
+protected:
+    void showEvent(QShowEvent *);
+
+private slots:
+    void slotUpdatePosition();
+    void slotUpdateScale();
+    void slotApply();
+
+private:
+    KConfigDialog *m_ConfigDialog;
+    Align *alignModule;
+};
+
+}
+
+#endif // OPSASTROMETRY_H
diff --git a/kstars/ekos/align/opsastrometry.ui b/kstars/ekos/align/opsastrometry.ui
new file mode 100644
index 000000000..6a82eed22
--- /dev/null
+++ b/kstars/ekos/align/opsastrometry.ui
@@ -0,0 +1,741 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OpsAstrometry</class>
+ <widget class="QWidget" name="OpsAstrometry">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>426</width>
+    <height>379</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_5">
+   <item>
+    <widget class="QGroupBox" name="groupBox_3">
+     <property name="title">
+      <string>Basic Options</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_2">
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_5">
+        <property name="topMargin">
+         <number>0</number>
+        </property>
+        <item>
+         <widget class="QCheckBox" name="kcfg_AstrometryUseNoFITS2FITS">
+          <property name="toolTip">
+           <string><html><head/><body><p>This option should <span style=" font-weight:600;">ONLY</span> be checked if your astrometry.net version is 0.67 or earlier. Uncheck for any versions greater than 0.67</p></body></html></string>
+          </property>
+          <property name="text">
+           <string>--no-fits2fits</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QCheckBox" name="kcfg_AstrometryUseResort">
+          <property name="toolTip">
+           <string><html><head/><body><p>Check this option if your image does not have much nebulosity. If it does have strong nebulosity, uncheck it.</p></body></html></string>
+          </property>
+          <property name="text">
+           <string>--resort</string>
+          </property>
+          <property name="checked">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QCheckBox" name="kcfg_AstrometryUseNoVerify">
+          <property name="toolTip">
+           <string><html><head/><body><p>This will prevent the solver from looking at an already existing WCS Header before blindly trying to solve the image. It is recommended to keep it checked.</p></body></html></string>
+          </property>
+          <property name="text">
+           <string>--no-verify</string>
+          </property>
+          <property name="checked">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QCheckBox" name="kcfg_AstrometryDetectParity">
+          <property name="toolTip">
+           <string><html><head/><body><p>Detect parity and reuse it to speed up solver.</p></body></html></string>
+          </property>
+          <property name="text">
+           <string>Parity</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QCheckBox" name="checkBox_27">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="toolTip">
+           <string><html><head/><body><p>Prevents creation of unnecessary files unused by Ekos.</p></body></html></string>
+          </property>
+          <property name="text">
+           <string>--no-plots</string>
+          </property>
+          <property name="checked">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QCheckBox" name="checkBox_30">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>50</width>
+            <height>16777215</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string><html><head/><body><p>Overwrite already generated files. It must be checked to prevent solver failure.</p></body></html></string>
+          </property>
+          <property name="text">
+           <string>-O</string>
+          </property>
+          <property name="checked">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Imaging Options</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="2" column="1">
+       <widget class="QLabel" name="label_7">
+        <property name="toolTip">
+         <string><p>The units of the imager scale bounds above.</p>
+<ul>
+<li>dw: degree width</li>
+<li>aw: arcminute width</li>
+<li>app: arcsecs per pixel</li>
+</ul></string>
+        </property>
+        <property name="text">
+         <string>units</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="4" rowspan="2">
+       <widget class="QPushButton" name="updateScale">
+        <property name="minimumSize">
+         <size>
+          <width>22</width>
+          <height>22</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>22</width>
+          <height>22</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>Update Image Scale Bounds from the currently active camera &amp; telescope combination.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="2">
+       <widget class="QLineEdit" name="lineEdit_42">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>30</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>The high end of the imager scale, calculated as a little bigger than the longer dimension of the image.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>H</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="3">
+       <widget class="QComboBox" name="kcfg_AstrometryImageScaleUnits">
+        <property name="maximumSize">
+         <size>
+          <width>110</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string><p>The units of the imager scale bounds above.</p>
+<ul>
+<li>dw: degree width</li>
+<li>aw: arcminute width</li>
+<li>app: arcsecs per pixel</li>
+</ul></string>
+        </property>
+        <property name="currentIndex">
+         <number>0</number>
+        </property>
+        <item>
+         <property name="text">
+          <string>dw</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>aw</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>app</string>
+         </property>
+        </item>
+       </widget>
+      </item>
+      <item row="3" column="3">
+       <widget class="QSpinBox" name="kcfg_AstrometryDownsample">
+        <property name="minimum">
+         <number>2</number>
+        </property>
+        <property name="maximum">
+         <number>16</number>
+        </property>
+        <property name="value">
+         <number>2</number>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QCheckBox" name="kcfg_AstrometryUseDownsample">
+        <property name="toolTip">
+         <string><html><head/><body><p>Downsample the image to shrink its size and speed up the solver.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>Down Sample</string>
+        </property>
+        <property name="checked">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="0">
+       <widget class="QCheckBox" name="kcfg_AstrometryUseImageScale">
+        <property name="toolTip">
+         <string><html><head/><body><p>Set image scale to speed up solver as it does not have to search index files of different image scales.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>Use Scale</string>
+        </property>
+        <property name="checked">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="2">
+       <widget class="QLineEdit" name="lineEdit_41">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>30</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>The lower end of the imager scale, calculated as a little smaller than the shorter dimension of the image.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>L</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="3">
+       <widget class="QDoubleSpinBox" name="kcfg_AstrometryImageScaleLow">
+        <property name="decimals">
+         <number>3</number>
+        </property>
+        <property name="minimum">
+         <double>0.001000000000000</double>
+        </property>
+        <property name="maximum">
+         <double>999.000000000000000</double>
+        </property>
+        <property name="value">
+         <double>0.001000000000000</double>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1" colspan="2">
+       <widget class="QLineEdit" name="lineEdit_55">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>Downsample the image to shrink its size and speed up the solver.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>downsample</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="3">
+       <widget class="QDoubleSpinBox" name="kcfg_AstrometryImageScaleHigh">
+        <property name="decimals">
+         <number>3</number>
+        </property>
+        <property name="minimum">
+         <double>0.001000000000000</double>
+        </property>
+        <property name="maximum">
+         <double>999.000000000000000</double>
+        </property>
+        <property name="value">
+         <double>0.001000000000000</double>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLabel" name="label_13">
+        <property name="toolTip">
+         <string><html><head/><body><p>The high end of the imager scale, calculated as a little bigger than the longer dimension of the image.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>High</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <layout class="QHBoxLayout" name="horizontalLayout">
+        <item>
+         <widget class="QCheckBox" name="kcfg_AstrometryAutoUpdateImageScale">
+          <property name="toolTip">
+           <string>Automatically update image scale values when CCD and/or Mount parameters are updated.</string>
+          </property>
+          <property name="text">
+           <string>Auto Update</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLabel" name="imageWarningLabel">
+          <property name="enabled">
+           <bool>true</bool>
+          </property>
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>22</width>
+            <height>22</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>22</width>
+            <height>22</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string><html><head/><body><nobr>Image Scale Auto Update is turned off!</nobr></body></html></string>
+          </property>
+          <property name="text">
+           <string/>
+          </property>
+          <property name="pixmap">
+           <pixmap resource="../../data/kstars.qrc">:/icons/breeze/default/security-medium.svg</pixmap>
+          </property>
+          <property name="scaledContents">
+           <bool>true</bool>
+          </property>
+          <property name="alignment">
+           <set>Qt::AlignCenter</set>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item row="2" column="2">
+       <widget class="QLineEdit" name="lineEdit_50">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>30</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>The units of the imager scale bounds above.</p><p>dw: degree width</p><p>aw: arcminute width</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>u</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLabel" name="label_12">
+        <property name="toolTip">
+         <string><html><head/><body><p>The lower end of the imager scale, calculated as a little smaller than the shorter dimension of the image.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>Low</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="5">
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="groupBox_2">
+     <property name="title">
+      <string>Position Options</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="1">
+       <widget class="QLabel" name="label_14">
+        <property name="toolTip">
+         <string><html><head/><body><p>The RA of the Estimated Telescope/Image Field Position in hh:mm:ss notation</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>RA</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="3">
+       <widget class="dmsBox" name="estRA">
+        <property name="enabled">
+         <bool>true</bool>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>The RA of the Estimated Telescope/Image Field Position in hh:mm:ss notation</p></body></html></string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="4" rowspan="2">
+       <widget class="QPushButton" name="updatePosition">
+        <property name="minimumSize">
+         <size>
+          <width>22</width>
+          <height>22</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>22</width>
+          <height>22</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>Update coordinates to the current telescope position</p></body></html></string>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="2">
+       <widget class="QLineEdit" name="lineEdit_44">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>30</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>The Search Radius for the Estimated Telescope/Image Field Position in degrees.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>5</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="2">
+       <widget class="QLineEdit" name="lineEdit_47">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>30</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>The RA of the Estimated Telescope/Image Field Position in hh:mm:ss notation</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>3</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QLabel" name="label">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="3">
+       <widget class="QDoubleSpinBox" name="kcfg_AstrometryRaduis">
+        <property name="minimum">
+         <double>1.000000000000000</double>
+        </property>
+        <property name="maximum">
+         <double>360.000000000000000</double>
+        </property>
+        <property name="value">
+         <double>30.000000000000000</double>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="2">
+       <widget class="QLineEdit" name="lineEdit_48">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>30</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>The DEC of the Estimated Telescope/Image Field Position in dd:mm:ss notation</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>4</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="3">
+       <widget class="dmsBox" name="estDec">
+        <property name="enabled">
+         <bool>true</bool>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>70</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string><html><head/><body><p>The DEC of the Estimated Telescope/Image Field Position in dd:mm:ss notation</p></body></html></string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLabel" name="label_8">
+        <property name="toolTip">
+         <string><html><head/><body><p>The Search Radius for the Estimated Telescope/Image Field Position in degrees.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>Radius</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLabel" name="label_15">
+        <property name="toolTip">
+         <string><html><head/><body><p>The DEC of the Estimated Telescope/Image Field Position in dd:mm:ss notation</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>DEC</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <layout class="QHBoxLayout" name="horizontalLayout_3">
+        <item>
+         <widget class="QCheckBox" name="kcfg_AstrometryAutoUpdatePosition">
+          <property name="toolTip">
+           <string>Automatically update position coordinates when mount comples slewing.</string>
+          </property>
+          <property name="text">
+           <string>Auto Update</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLabel" name="positionWarningLabel">
+          <property name="enabled">
+           <bool>true</bool>
+          </property>
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>22</width>
+            <height>22</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>22</width>
+            <height>22</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string><html><head/><body><nobr>Position Auto Update is turned off!</nobr></body></html></string>
+          </property>
+          <property name="text">
+           <string/>
+          </property>
+          <property name="pixmap">
+           <pixmap resource="../../data/kstars.qrc">:/icons/breeze/default/security-medium.svg</pixmap>
+          </property>
+          <property name="scaledContents">
+           <bool>true</bool>
+          </property>
+          <property name="alignment">
+           <set>Qt::AlignCenter</set>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item row="0" column="0">
+       <widget class="QCheckBox" name="kcfg_AstrometryUsePosition">
+        <property name="toolTip">
+         <string><html><head/><body><p>Set estimated position to speed up astrometry solver as it does not have to search in other areas of the sky.</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>Use Position</string>
+        </property>
+        <property name="checked">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="5">
+       <spacer name="horizontalSpacer_2">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+     <zorder>label_14</zorder>
+     <zorder>estRA</zorder>
+     <zorder>lineEdit_44</zorder>
+     <zorder>lineEdit_47</zorder>
+     <zorder>kcfg_AstrometryRaduis</zorder>
+     <zorder>lineEdit_48</zorder>
+     <zorder>estDec</zorder>
+     <zorder>label_8</zorder>
+     <zorder>label_15</zorder>
+     <zorder>kcfg_AstrometryUsePosition</zorder>
+     <zorder>label</zorder>
+     <zorder>updatePosition</zorder>
+     <zorder>horizontalSpacer_2</zorder>
+    </widget>
+   </item>
+   <item>
+    <layout class="QFormLayout" name="formLayout">
+     <item row="0" column="0">
+      <widget class="QLabel" name="label_3">
+       <property name="text">
+        <string>Custom:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QLineEdit" name="kcfg_AstrometryCustomOptions">
+       <property name="toolTip">
+        <string><html><head/><body><p>Additional optional astrometry.net options</p></body></html></string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="verticalSpacer_4">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>dmsBox</class>
+   <extends>QLineEdit</extends>
+   <header>widgets/dmsbox.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="../../data/kstars.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/kstars/ekos/align/remoteastrometryparser.cpp b/kstars/ekos/align/remoteastrometryparser.cpp
index 071d51b96..4c8ad2bde 100644
--- a/kstars/ekos/align/remoteastrometryparser.cpp
+++ b/kstars/ekos/align/remoteastrometryparser.cpp
@@ -63,7 +63,7 @@ bool RemoteAstrometryParser::startSovler(const QString &filename,  const QString
 
     QStringList solverArgs = args;
     // Add parity option if none is give and we already know parity before
-    if (parity.isEmpty() == false && args.contains("parity") == false)
+    if (Options::astrometryDetectParity() && parity.isEmpty() == false && args.contains("parity") == false)
         solverArgs << "--parity" << parity;
 
     for (int i=0; i < solverSettings->ntp; i++)
diff --git a/kstars/ekos/ekosmanager.cpp b/kstars/ekos/ekosmanager.cpp
index db31c5569..db39fec22 100644
--- a/kstars/ekos/ekosmanager.cpp
+++ b/kstars/ekos/ekosmanager.cpp
@@ -1159,19 +1159,19 @@ void EkosManager::processNewNumber(INumberVectorProperty *nvp)
         if (guideProcess)
         {
             guideProcess->setTelescope(managedDevices[KSTARS_TELESCOPE]);
-            guideProcess->syncTelescopeInfo();
+            //guideProcess->syncTelescopeInfo();
         }
 
         if (alignProcess)
         {
             alignProcess->setTelescope(managedDevices[KSTARS_TELESCOPE]);
-            alignProcess->syncTelescopeInfo();
+            //alignProcess->syncTelescopeInfo();
         }
 
         if (mountProcess)
         {
             mountProcess->setTelescope(managedDevices[KSTARS_TELESCOPE]);
-            mountProcess->syncTelescopeInfo();
+            //mountProcess->syncTelescopeInfo();
         }
 
         return;
@@ -1232,19 +1232,19 @@ void EkosManager::processNewProperty(INDI::Property* prop)
         if (guideProcess)
         {
             guideProcess->setTelescope(managedDevices[KSTARS_TELESCOPE]);
-            guideProcess->syncTelescopeInfo();
+            //guideProcess->syncTelescopeInfo();
         }
 
         if (alignProcess)
         {
             alignProcess->setTelescope(managedDevices[KSTARS_TELESCOPE]);
-            alignProcess->syncTelescopeInfo();
+            //alignProcess->syncTelescopeInfo();
         }
 
         if (mountProcess)
         {
             mountProcess->setTelescope(managedDevices[KSTARS_TELESCOPE]);
-            mountProcess->syncTelescopeInfo();
+            //mountProcess->syncTelescopeInfo();
         }
 
         return;
@@ -2184,10 +2184,23 @@ void EkosManager::setTarget(SkyObject *o)
 
 void EkosManager::showEkosOptions()
 {
+    QWidget *currentWidget = toolsWidget->currentWidget();
+
+    if (alignProcess && alignProcess == currentWidget)
+    {
+        KConfigDialog::showDialog( "alignsettings" );
+        return;
+    }
+
+    if (guideProcess && guideProcess == currentWidget)
+    {
+        KConfigDialog::showDialog( "guidesettings" );
+        return;
+    }
+
     if (ekosOptionsWidget == NULL)
         optionsB->click();
-
-    if (ekosOptionsWidget && KConfigDialog::showDialog( "settings" ))
+    else if (KConfigDialog::showDialog( "settings" ))
     {
         KConfigDialog *cDialog = KConfigDialog::exists("settings");
         cDialog->setCurrentPage(ekosOptionsWidget);
diff --git a/kstars/ekos/opsekos.cpp b/kstars/ekos/opsekos.cpp
index cf16d7669..61c89b954 100644
--- a/kstars/ekos/opsekos.cpp
+++ b/kstars/ekos/opsekos.cpp
@@ -27,7 +27,6 @@
 #include "ksuserdb.h"
 #include "ekos/auxiliary/darklibrary.h"
 #include "kspaths.h"
-#include "fov.h"
 
 OpsEkos::OpsEkos()
         : QTabWidget( KStars::Instance() )
@@ -37,27 +36,6 @@ OpsEkos::OpsEkos()
     //Get a pointer to the KConfigDialog
     m_ConfigDialog = KConfigDialog::exists( "settings" );
 
-#ifdef Q_OS_OSX
-connect(kcfg_astrometrySolverIsInternal, SIGNAL(clicked()), this, SLOT(toggleSolverInternal()));
-kcfg_astrometrySolverIsInternal->setToolTip(i18n("Internal or External Plate Solver?"));
-if(Options::astrometrySolverIsInternal())
-    kcfg_astrometrySolver->setEnabled(false);
-
-connect(kcfg_astrometryConfFileIsInternal, SIGNAL(clicked()), this, SLOT(toggleConfigInternal()));
-kcfg_astrometryConfFileIsInternal->setToolTip(i18n("Internal or External astrometry.cfg?"));
-if(Options::astrometryConfFileIsInternal())
-    kcfg_astrometryConfFile->setEnabled(false);
-
-connect(kcfg_wcsIsInternal, SIGNAL(clicked()), this, SLOT(toggleWCSInternal()));
-kcfg_wcsIsInternal->setToolTip(i18n("Internal or External wcsinfo?"));
-if(Options::wcsIsInternal())
-    kcfg_astrometryWCSInfo->setEnabled(false);
-#else
-kcfg_astrometrySolverIsInternal->setVisible(false);
-kcfg_astrometryConfFileIsInternal->setVisible(false);
-kcfg_wcsIsInternal->setVisible(false);
-#endif
-
     connect( m_ConfigDialog->button(QDialogButtonBox::Apply), SIGNAL( clicked() ), SLOT( slotApply() ) );
     connect( m_ConfigDialog->button(QDialogButtonBox::Ok), SIGNAL( clicked() ), SLOT( slotApply() ) );
 
@@ -75,47 +53,6 @@ kcfg_wcsIsInternal->setVisible(false);
 
 OpsEkos::~OpsEkos() {}
 
-void OpsEkos::toggleSolverInternal()
-{
-    kcfg_astrometrySolver->setEnabled(!kcfg_astrometrySolverIsInternal->isChecked());
-    if(kcfg_astrometrySolverIsInternal->isChecked())
-        kcfg_astrometrySolver->setText("*Internal Solver*");
-    else
-        kcfg_astrometrySolver->setText("/usr/local/bin/solve-field");
-}
-
-void OpsEkos::toggleConfigInternal()
-{
-    kcfg_astrometryConfFile->setEnabled(!kcfg_astrometryConfFileIsInternal->isChecked());
-    if(kcfg_astrometryConfFileIsInternal->isChecked())
-        kcfg_astrometryConfFile->setText("*Internal astrometry.cfg*");
-    else
-        kcfg_astrometryConfFile->setText("/etc/astrometry.cfg");
-}
-
-void OpsEkos::toggleWCSInternal()
-{
-    kcfg_astrometryWCSInfo->setEnabled(!kcfg_wcsIsInternal->isChecked());
-    if(kcfg_wcsIsInternal->isChecked())
-        kcfg_astrometryWCSInfo->setText("*Internal wcsinfo*");
-    else
-        kcfg_astrometryWCSInfo->setText("/usr/local/bin/wcsinfo");
-}
-
-void OpsEkos::slotApply()
-{
-    EkosManager *ekosManager = KStars::Instance()->ekosManager();
-
-    if (ekosManager)
-    {
-        Ekos::Align *alignModule = ekosManager->alignModule();
-
-        if (alignModule && alignModule->fov())
-            alignModule->fov()->setImageDisplay(kcfg_SolverWCS->isChecked());
-    }
-
-}
-
 void OpsEkos::clearAll()
 {
     if (darkFramesModel->rowCount() == 0)
diff --git a/kstars/ekos/opsekos.h b/kstars/ekos/opsekos.h
index 6d076a9d3..6071fcfb7 100644
--- a/kstars/ekos/opsekos.h
+++ b/kstars/ekos/opsekos.h
@@ -33,12 +33,6 @@ public:
     ~OpsEkos();
 
 private slots:
-
-    void slotApply();
-    void toggleSolverInternal();
-    void toggleConfigInternal();
-    void toggleWCSInternal();
-
     void clearAll();
     void clearRow();
     void openDarksFolder();
diff --git a/kstars/ekos/opsekos.ui b/kstars/ekos/opsekos.ui
index 6ab54da0c..9e2cfbde0 100644
--- a/kstars/ekos/opsekos.ui
+++ b/kstars/ekos/opsekos.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>361</width>
-    <height>321</height>
+    <width>353</width>
+    <height>179</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -298,212 +298,6 @@
     </item>
    </layout>
   </widget>
-  <widget class="QWidget" name="astrometryTab">
-   <attribute name="title">
-    <string>Astrometry</string>
-   </attribute>
-   <layout class="QVBoxLayout" name="verticalLayout_3">
-    <item>
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="2">
-       <widget class="QLineEdit" name="kcfg_astrometrySolver">
-        <property name="toolTip">
-         <string>Astrometry.net solve-field binary</string>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="5">
-       <widget class="QLineEdit" name="kcfg_astrometryAPIKey">
-        <property name="toolTip">
-         <string>Astrometry.net configuration file</string>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="5">
-       <widget class="QCheckBox" name="kcfg_astrometryUseJPEG">
-        <property name="toolTip">
-         <string>Use JPEG format, instead of FITS, to upload images to the online astrometry.net service</string>
-        </property>
-        <property name="text">
-         <string>Use JPG for upload</string>
-        </property>
-        <property name="checked">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="3">
-       <widget class="QCheckBox" name="kcfg_wcsIsInternal">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="4">
-       <widget class="QLabel" name="label_17">
-        <property name="text">
-         <string>API Key:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="2">
-       <widget class="QLineEdit" name="kcfg_astrometryConfFile">
-        <property name="toolTip">
-         <string>Astrometry.net configuration file</string>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QLabel" name="label_14">
-        <property name="text">
-         <string>config:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="QLabel" name="label_18">
-        <property name="text">
-         <string>API URL:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="5">
-       <widget class="QLineEdit" name="kcfg_astrometryWCSInfo">
-        <property name="toolTip">
-         <string>Astrometry.net wcsinfo binary</string>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0">
-       <widget class="QCheckBox" name="kcfg_astrometryConfFileIsInternal">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QLabel" name="label_15">
-        <property name="text">
-         <string>solver:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="4">
-       <widget class="QLabel" name="label_16">
-        <property name="text">
-         <string>wcsinfo:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="2">
-       <widget class="QLineEdit" name="kcfg_astrometryAPIURL">
-        <property name="toolTip">
-         <string>Astrometry.net configuration file</string>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0">
-       <widget class="QCheckBox" name="kcfg_astrometrySolverIsInternal">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </item>
-    <item>
-     <layout class="QHBoxLayout" name="horizontalLayout_5">
-      <item>
-       <widget class="QCheckBox" name="kcfg_SolverUpdateCoords">
-        <property name="toolTip">
-         <string>Automatically update the solver's RA & Declination coordinates after telescope slew is completed.</string>
-        </property>
-        <property name="statusTip">
-         <string>Automatically update the solver's RA & Declination coordinates after telescope slew is completed.</string>
-        </property>
-        <property name="text">
-         <string>Update Coords</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QCheckBox" name="kcfg_SolverWCS">
-        <property name="toolTip">
-         <string>enable World Coordinate System (WCS). WCS is used to encode RA/DEC coordinates in captured CCD images.</string>
-        </property>
-        <property name="text">
-         <string>WCS</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QCheckBox" name="kcfg_SolverVerbose">
-        <property name="toolTip">
-         <string>Log verbose solver output</string>
-        </property>
-        <property name="statusTip">
-         <string/>
-        </property>
-        <property name="text">
-         <string>Verbose</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QCheckBox" name="kcfg_SolverOverlay">
-        <property name="toolTip">
-         <string>Display received FITS images unto solver FOV rectangle in the sky map</string>
-        </property>
-        <property name="text">
-         <string>Overlay</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <spacer name="horizontalSpacer_4">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-     </layout>
-    </item>
-    <item>
-     <spacer name="verticalSpacer_6">
-      <property name="orientation">
-       <enum>Qt::Vertical</enum>
-      </property>
-      <property name="sizeHint" stdset="0">
-       <size>
-        <width>20</width>
-        <height>269</height>
-       </size>
-      </property>
-     </spacer>
-    </item>
-   </layout>
-  </widget>
   <widget class="QWidget" name="darkLibraryTab">
    <attribute name="title">
     <string>Dark Library</string>
diff --git a/kstars/kstars.kcfg b/kstars/kstars.kcfg
index 140ec41fc..558b8d0c9 100644
--- a/kstars/kstars.kcfg
+++ b/kstars/kstars.kcfg
@@ -1348,57 +1348,19 @@
       <entry name="loadDefaultConfig" type="Bool">
          <label>Always load device default configuration upon successful connection?</label>
          <default>false</default>
-      </entry>
-      <entry name="astrometrySolver" type="String">
-         <label>astrometry.net solve-field binary</label>
-         <whatsthis>Path to astrometry.net solver location.</whatsthis>
-         <default>/usr/bin/solve-field</default>
-      </entry>
-      <entry name="astrometrySolverIsInternal" type="Bool">
-         <label>Internal or External Astrometry Solver?</label>
-         <default>false</default>
-      </entry>
-      <entry name="astrometryWCSInfo" type="String">
-         <label>astrometry.net wcsinfo binary</label>
-         <whatsthis>Path to astrometry.net wcsinfo location.</whatsthis>
-         <default>/usr/bin/wcsinfo</default>
-      </entry>
-      <entry name="wcsIsInternal" type="Bool">
-         <label>Internal or External wcsinfo?</label>
-         <default>false</default>
-      </entry>
-      <entry name="astrometryConfFile" type="String">
-         <label>astrometry.net configuration file</label>
-         <whatsthis>Path to astrometry.net file location.</whatsthis>
-         <default>/etc/astrometry.cfg</default>
-      </entry>
-      <entry name="astrometryConfFileIsInternal" type="Bool">
-         <label>Internal or External Astrometry.net Conf File?</label>
-         <default>false</default>
-      </entry>
-      <entry name="astrometryAPIKey" type="String">
-         <label>astrometry.net API Key</label>
-         <whatsthis>Key to access astrometry.net online web services. You must register with astrometry.net to obtain a key.</whatsthis>
-         <default>iczikaqstszeptgs</default>
-      </entry>
-      <entry name="astrometryAPIURL" type="String">
-         <label>astrometry.net API URL</label>
-         <default>http://nova.astrometry.net</default>
-      </entry>
-      <entry name="astrometryUseJPEG" type="Bool">
-         <label>Use JPEG format, instead of FITS, to upload images to the astrometry.net online service.</label>
-         <default>true</default>
-      </entry>
-      <entry name="MaxDarkTemperatureDiff" type="Double">
-         <label>Maximum acceptable difference between current and recorded dark frame temperature set point. When the difference exceeds this value, a new dark frame shall be captured for this set point.</label>
-         <default>1</default>
-      </entry>
-      <entry name="shutterfulCCDs" type="StringList">
-         <label>List of CCDs with mechanical or electronic shutters.</label>
-      </entry>
-      <entry name="shutterlessCCDs" type="StringList">
-         <label>List of CCDs without mechanical or electronic shutters.</label>
-      </entry>
+      </entry>      
+   </group>
+   <group name="DarkLibrary">
+   <entry name="MaxDarkTemperatureDiff" type="Double">
+      <label>Maximum acceptable difference between current and recorded dark frame temperature set point. When the difference exceeds this value, a new dark frame shall be captured for this set point.</label>
+      <default>1</default>
+   </entry>
+   <entry name="shutterfulCCDs" type="StringList">
+      <label>List of CCDs with mechanical or electronic shutters.</label>
+   </entry>
+   <entry name="shutterlessCCDs" type="StringList">
+      <label>List of CCDs without mechanical or electronic shutters.</label>
+   </entry>
    </group>
    <group name="Mount">
       <entry name="MinimumAltLimit" type="Double">
@@ -1568,24 +1530,16 @@
       <entry name="SolverBinningIndex" type="UInt">
          <label>Default CCD binning index while in alignment mode</label>
          <whatsthis>Set binning index of CCD camera while in alignment mode. Default values 0-3 corresponding to 1x1 to 4x4 binning</whatsthis>
-         <default>1</default>
-      </entry>
-      <entry name="SolverUpdateCoords" type="Bool">
-         <label>Update Solver RA and DEC search coordinates.</label>
-         <whatsthis>Automatically update the solver RA and Declination coordinates after telescope slew is completed.</whatsthis>
-         <default>true</default>
+         <default>0</default>
       </entry>
-      <entry name="SolverVerbose" type="Bool">
+      <entry name="AstrometrySolverVerbose" type="Bool">
          <whatsthis>Display detailed verbose messages of the astrometry solver process while in progress.</whatsthis>
          <default>false</default>
       </entry>
       <entry name="SolverType" type="UInt">
          <label>Set solver type (online, offline, remote).</label>
          <default>0</default>
-      </entry>
-      <entry name="SolverOptions" type="String">
-         <label>Options passed to the astrometry solver.</label>
-      </entry>
+      </entry>      
       <entry name="GuideScopeCCDs" type="StringList">
          <label>List of CCDs using Guide Scope parameters instead of Primary Scope</label>
       </entry>
@@ -1593,11 +1547,11 @@
          <label>Action to take if solver if successful (Sync, Slew to Target, or None)</label>
          <default>0</default>
       </entry>
-      <entry name="SolverWCS" type="Bool">
+      <entry name="AstrometrySolverWCS" type="Bool">
          <label>World Coordinate System (WCS). WCS is used to encode RA/DEC coordinates in captured CCD images.</label>
          <default>false</default>
       </entry>
-      <entry name="SolverOverlay" type="Bool">
+      <entry name="AstrometrySolverOverlay" type="Bool">
          <label>Display received FITS images unto solver FOV rectangle in the sky map.</label>
          <default>false</default>
       </entry>
@@ -1613,6 +1567,109 @@
          <label>Time to wait in milliseconds after telescope slewing is complete before starting the next capture.</label>
          <default>1500</default>
       </entry>
+      <entry name="AstrometryUseNoFITS2FITS" type="Bool">
+         <label>Do not sanitize FITS. This option should only be checked if astrometry.net version is 0.67 or earlier. Uncheck for any versions greater than 0.67.</label>
+         <default>true</default>
+      </entry>
+      <entry name="AstrometryUseResort" type="Bool">
+         <label>Check this option if your image does not have much nebulosity. If it does have strong nebulosity, uncheck it.</label>
+         <default>true</default>
+      </entry>
+      <entry name="AstrometryUseNoVerify" type="Bool">
+         <label>This will prevent the solver from looking at an already existing WCS Header before blindly trying to solve the image. It is recommended to keep it checked.</label>
+         <default>true</default>
+      </entry>
+      <entry name="AstrometryUseImageScale" type="Bool">
+         <label>Set image scale to speed up solver as it does not have to search index files of different image scales.</label>
+         <default>true</default>
+      </entry>
+      <entry name="AstrometryImageScaleLow" type="Double">
+         <label>Lower image scale.</label>
+      </entry>
+      <entry name="AstrometryImageScaleHigh" type="Double">
+         <label>Upper image scale.</label>
+      </entry>
+      <entry name="AstrometryAutoUpdateImageScale" type="Bool">
+         <label>Automatically update image scale when CCD or Mount parameters are updated.</label>
+         <default>true</default>
+      </entry>
+      <entry name="AstrometryImageScaleUnits" type="UInt">
+         <label>Image scale units in arcminutes (aw), degrees (dw), or arcsec per pixel (app)</label>
+         <default>1</default>
+      </entry>
+      <entry name="AstrometryUseDownsample" type="Bool">
+         <label>Downsample the image to shrink its size and speed up the solver.</label>
+         <default>true</default>
+      </entry>
+      <entry name="AstrometryDownsample" type="UInt">
+         <label>Downsample factor</label>
+         <default>2</default>
+      </entry>
+      <entry name="AstrometryUsePosition" type="Bool">
+         <label>Set estimated position to speed up astrometry solver as it does not have to search in other areas of the sky.</label>
+         <default>true</default>
+      </entry>
+      <entry name="AstrometryPositionRA" type="Double">
+         <label>User supplied Right Ascension value in degrees to be passed to the solver.</label>
+      </entry>
+      <entry name="AstrometryPositionDE" type="Double">
+         <label>User supplied declination value in degrees to be passed to the solver.</label>
+      </entry>
+      <entry name="AstrometryAutoUpdatePosition" type="Bool">
+         <label>Automatically update position coordinates when mounts completes slewing.</label>
+         <default>true</default>
+      </entry>
+      <entry name="AstrometryRadius" type="Double">
+         <label>The Search Radius for the Estimated Telescope/Image Field Position in degrees.</label>
+         <default>30</default>
+      </entry>
+      <entry name="AstrometryDetectParity" type="Bool">
+         <label>Detect parity and reuse it to speed up solver.</label>
+         <default>true</default>
+      </entry>
+      <entry name="AstrometryCustomOptions" type="String">
+         <label>Additional optional astrometry.net options</label>
+      </entry>
+      <entry name="AstrometrySolverBinary" type="String">
+         <label>astrometry.net solve-field binary</label>
+         <whatsthis>Path to astrometry.net solver location.</whatsthis>
+         <default>/usr/bin/solve-field</default>
+      </entry>
+      <entry name="AstrometrySolverIsInternal" type="Bool">
+         <label>Internal or External Astrometry Solver?</label>
+         <default>false</default>
+      </entry>
+      <entry name="AstrometryWCSInfo" type="String">
+         <label>astrometry.net wcsinfo binary</label>
+         <whatsthis>Path to astrometry.net wcsinfo location.</whatsthis>
+         <default>/usr/bin/wcsinfo</default>
+      </entry>
+      <entry name="AstrometryWCSIsInternal" type="Bool">
+         <label>Internal or External wcsinfo?</label>
+         <default>false</default>
+      </entry>
+      <entry name="AstrometryConfFile" type="String">
+         <label>astrometry.net configuration file</label>
+         <whatsthis>Path to astrometry.net file location.</whatsthis>
+         <default>/etc/astrometry.cfg</default>
+      </entry>
+      <entry name="AstrometryConfFileIsInternal" type="Bool">
+         <label>Internal or External Astrometry.net Conf File?</label>
+         <default>false</default>
+      </entry>
+      <entry name="AstrometryAPIKey" type="String">
+         <label>astrometry.net API Key</label>
+         <whatsthis>Key to access astrometry.net online web services. You must register with astrometry.net to obtain a key.</whatsthis>
+         <default>iczikaqstszeptgs</default>
+      </entry>
+      <entry name="AstrometryAPIURL" type="String">
+         <label>astrometry.net API URL</label>
+         <default>http://nova.astrometry.net</default>
+      </entry>
+      <entry name="AstrometryUseJPEG" type="Bool">
+         <label>Use JPEG format, instead of FITS, to upload images to the astrometry.net online service.</label>
+         <default>true</default>
+      </entry>
    </group>
    <group name="Guide">
       <entry name="DefaultGuideCCD" type="String">


More information about the Kstars-devel mailing list