diff --git a/src/FDM/YASim/ControlMap.cpp b/src/FDM/YASim/ControlMap.cpp
index 9fb6d0985..4beef0fe0 100644
--- a/src/FDM/YASim/ControlMap.cpp
+++ b/src/FDM/YASim/ControlMap.cpp
@@ -219,12 +219,12 @@ void ControlMap::applyControls(float dt)
 	case LEXTEND:  ((Launchbar*)obj)->setExtension(lval);      break;
     case LACCEL:   ((Launchbar*)obj)->setAcceleration(lval);   break;
 	case CASTERING:((Gear*)obj)->setCastering(lval != 0);      break;
-	case SLAT:     ((Wing*)obj)->setSlatPos(lval);                break;
-	case FLAP0:    ((Wing*)obj)->setFlap0Pos(lval, rval);         break;
-	case FLAP0EFFECTIVENESS: ((Wing*)obj)->setFlap0Effectiveness(lval); break;
-	case FLAP1:    ((Wing*)obj)->setFlap1Pos(lval, rval);         break;
-	case FLAP1EFFECTIVENESS: ((Wing*)obj)->setFlap1Effectiveness(lval); break;
-	case SPOILER:  ((Wing*)obj)->setSpoilerPos(lval, rval);       break;
+	case SLAT:     ((Wing*)obj)->setFlapPos(WING_SLAT,lval);                break;
+	case FLAP0:    ((Wing*)obj)->setFlapPos(WING_FLAP0, lval, rval);         break;
+	case FLAP0EFFECTIVENESS: ((Wing*)obj)->setFlapEffectiveness(WING_FLAP0,lval); break;
+	case FLAP1:    ((Wing*)obj)->setFlapPos(WING_FLAP1,lval, rval);         break;
+	case FLAP1EFFECTIVENESS: ((Wing*)obj)->setFlapEffectiveness(WING_FLAP1,lval); break;
+	case SPOILER:  ((Wing*)obj)->setFlapPos(WING_SPOILER, lval, rval);       break;
         case COLLECTIVE:   ((Rotor*)obj)->setCollective(lval);     break;
         case CYCLICAIL:    ((Rotor*)obj)->setCyclicail(lval,rval); break;
         case CYCLICELE:    ((Rotor*)obj)->setCyclicele(lval,rval); break;
diff --git a/src/FDM/YASim/Wing.cpp b/src/FDM/YASim/Wing.cpp
index e39bb4d85..f706c6d92 100644
--- a/src/FDM/YASim/Wing.cpp
+++ b/src/FDM/YASim/Wing.cpp
@@ -44,59 +44,40 @@ void Wing::setFlapParams(WingFlaps i, FlapParams fp)
     _flapParams[i] = fp;
 }
 
-void Wing::setFlap0Pos(float lval, float rval)
+void Wing::setFlapPos(WingFlaps f,float lval, float rval)
 {
-    lval = Math::clamp(lval, -1, 1);
-    rval = Math::clamp(rval, -1, 1);
-    for(int i=0; i<_flap0Surfs.size(); i++) {
-      ((Surface*)_flap0Surfs.get(i))->setFlapPos(lval);
-      if(_mirror) ((Surface*)_flap0Surfs.get(++i))->setFlapPos(rval);
+    float min {-1};
+    if (f == WING_SPOILER || f == WING_SLAT) {
+        min = 0;
+    }
+    lval = Math::clamp(lval, min, 1);
+    rval = Math::clamp(rval, min, 1);
+    for(int i=0; i<_flapSurfs[f].size(); i++) {
+        switch (f) {
+            case WING_FLAP0:
+            case WING_FLAP1:
+                ((Surface*)_flapSurfs[f].get(i))->setFlapPos(lval);
+                if(_mirror) ((Surface*)_flapSurfs[f].get(++i))->setFlapPos(rval);
+                break;
+            case WING_SLAT:
+                ((Surface*)_flapSurfs[f].get(i))->setSlatPos(lval);
+                break;
+            case WING_SPOILER:
+                ((Surface*)_flapSurfs[f].get(i))->setSpoilerPos(lval);
+                if(_mirror) ((Surface*)_flapSurfs[f].get(++i))->setSpoilerPos(rval);
+                break;
+        }
     }
 }
 
-void Wing::setFlap0Effectiveness(float lval)
+void Wing::setFlapEffectiveness(WingFlaps f, float lval)
 {
     lval = Math::clamp(lval, 1, 10);
-    for(int i=0; i<_flap0Surfs.size(); i++) {
-        ((Surface*)_flap0Surfs.get(i))->setFlapEffectiveness(lval);
+    for(int i=0; i<_flapSurfs[f].size(); i++) {
+        ((Surface*)_flapSurfs[f].get(i))->setFlapEffectiveness(lval);
     }
 }
 
-void Wing::setFlap1Pos(float lval, float rval)
-{
-    lval = Math::clamp(lval, -1, 1);
-    rval = Math::clamp(rval, -1, 1);
-    for(int i=0; i<_flap1Surfs.size(); i++) {
-      ((Surface*)_flap1Surfs.get(i))->setFlapPos(lval);
-      if(_mirror) ((Surface*)_flap1Surfs.get(++i))->setFlapPos(rval);
-    }
-}
-
-void Wing::setFlap1Effectiveness(float lval)
-{
-    lval = Math::clamp(lval, 1, 10);
-    for(int i=0; i<_flap1Surfs.size(); i++) {
-        ((Surface*)_flap1Surfs.get(i))->setFlapEffectiveness(lval);
-    }
-}
-
-void Wing::setSpoilerPos(float lval, float rval)
-{
-    lval = Math::clamp(lval, 0, 1);
-    rval = Math::clamp(rval, 0, 1);
-    for(int i=0; i<_spoilerSurfs.size(); i++) {
-      ((Surface*)_spoilerSurfs.get(i))->setSpoilerPos(lval);
-      if(_mirror) ((Surface*)_spoilerSurfs.get(++i))->setSpoilerPos(rval);
-    }
-}
-
-void Wing::setSlatPos(float val)
-{
-    val = Math::clamp(val, 0, 1);
-    for(int i=0; i<_slatSurfs.size(); i++)
-      ((Surface*)_slatSurfs.get(i))->setSlatPos(val);
-}
-
 void Wing::calculateWingCoordinateSystem() {
   // prepare wing coordinate system, ignoring incidence and twist for now
   // (tail incidence is varied by the solver)
@@ -335,10 +316,10 @@ Surface* Wing::newSurface(float* pos, float* orient, float chord,
     if(hasSlat)    s->setSlatParams(_flapParams[WING_SLAT].aoa, _flapParams[WING_SLAT].drag);
     if(hasSpoiler) s->setSpoilerParams(_flapParams[WING_SPOILER].lift, _flapParams[WING_SPOILER].drag);    
 
-    if(hasFlap0)   _flap0Surfs.add(s);
-    if(hasFlap1)   _flap1Surfs.add(s);
-    if(hasSlat)    _slatSurfs.add(s);
-    if(hasSpoiler) _spoilerSurfs.add(s);
+    if(hasFlap0)   _flapSurfs[WING_FLAP0].add(s);
+    if(hasFlap1)   _flapSurfs[WING_FLAP1].add(s);
+    if(hasSlat)    _flapSurfs[WING_SLAT].add(s);
+    if(hasSpoiler) _flapSurfs[WING_SPOILER].add(s);
 
     s->setInducedDrag(_inducedDrag);
 
diff --git a/src/FDM/YASim/Wing.hpp b/src/FDM/YASim/Wing.hpp
index 3e913d43b..d31d752c3 100644
--- a/src/FDM/YASim/Wing.hpp
+++ b/src/FDM/YASim/Wing.hpp
@@ -20,8 +20,8 @@ struct FlapParams {
 enum WingFlaps {
     WING_FLAP0,
     WING_FLAP1,
+    WING_SPOILER,
     WING_SLAT,
-    WING_SPOILER
 };
 
 // FIXME: need to handle "inverted" controls for mirrored wings.
@@ -65,13 +65,9 @@ public:
     
     void setFlapParams(WingFlaps i, FlapParams fp);
 
-    // Set the control axes for the sub-surfaces
-    void setFlap0Pos(float lval, float rval);
-    void setFlap1Pos(float lval, float rval);
-    void setSpoilerPos(float lval, float rval);
-    void setSlatPos(float val);
-    void setFlap0Effectiveness(float lval);
-    void setFlap1Effectiveness(float lval);
+    // propergate the control axes value for the sub-surfaces
+    void setFlapPos(WingFlaps i, float lval, float rval = 0);
+    void setFlapEffectiveness(WingFlaps f, float lval);
 
     // Compile the thing into a bunch of Surface objects
     void compile();
@@ -116,11 +112,10 @@ private:
     
     struct SurfRec { Surface * surface; float weight; };
 
-    Vector _surfs;
-    Vector _flap0Surfs;
-    Vector _flap1Surfs;
-    Vector _slatSurfs;
-    Vector _spoilerSurfs;
+    // all surfaces of this wing
+    Vector _surfs;      
+    // surfaces having a certain type of flap (flap, slat, spoiler)
+    Vector _flapSurfs[sizeof(WingFlaps)]; 
 
     Version * _version;
     bool _mirror {false};