diff --git a/include/sot-dyninv/controller-pd.h b/include/sot-dyninv/controller-pd.h
index 8cb63768b0a7ca88414996c492e3ed8614017f64..bf97f66ec9016d939b98b80086a5f9595350ee44 100644
--- a/include/sot-dyninv/controller-pd.h
+++ b/include/sot-dyninv/controller-pd.h
@@ -66,6 +66,8 @@ namespace sot {
       public:
 	void size(const int & dimension);
 	int size(void) const;
+	void setStandardGains( const std::string & config );
+	void setGainVelocityOnly( void );
 
       public: /* --- ENTITY INHERITANCE --- */
 
diff --git a/src/controller-pd.cpp b/src/controller-pd.cpp
index 5dbd0722e35a88333f7088e8d5414096f54f46c2..cd4157cdc2b4730b6f77921dbd94f79152fc7376 100644
--- a/src/controller-pd.cpp
+++ b/src/controller-pd.cpp
@@ -62,6 +62,16 @@ namespace sot
       addCommand("setSize",
 		 makeDirectSetter(*this, &_dimension,
 				  docDirectSetter("dimension","int")));
+
+      addCommand("velocityOnly",
+		 makeCommandVoid0(*this,&ControllerPD::setGainVelocityOnly,
+				  docCommandVoid0("Set a friction-style controller.")));
+
+      addCommand("stdGain",
+		 makeCommandVoid1(*this,&ControllerPD::setStandardGains,
+				  docCommandVoid1("Set spefic gains.",
+						  "string (in low|medium|high)")));
+
     }
 
 
@@ -139,6 +149,85 @@ namespace sot
       return _dimension;
     }
 
+    void ControllerPD::
+    setGainVelocityOnly( void )
+    {
+      ml::Vector zero(_dimension); zero.fill(0);
+      positionSIN = zero;
+      positionRefSIN = zero;
+      KpSIN = zero;
+    }
+
+    /** Give some specific values for the Kp and Kd gains. Possible
+     * configs are "low", "middle" and "high".
+     * Warning: middle and high only works for dim 30.
+     * TODO: properly throw errors when needed.
+     */
+    void ControllerPD::
+    setStandardGains( const std::string & config )
+    {
+
+      if( config =="low" )
+	{
+	  // Low gains
+	  ml::Vector Kp(_dimension); Kp.fill(100);
+	  ml::Vector Kd(_dimension); Kd.fill(20);
+	  KpSIN = Kp;
+	  KdSIN = Kd;
+	}
+      else if( config =="medium" )
+	{
+	  // Medium gains
+	  if( _dimension != 30 )
+	    { std::cerr << "Only working for dim=30!" << std::endl; return; }
+
+	  ml::Vector Kp(_dimension),Kd(_dimension);
+	  unsigned int i=0;
+	  Kp(i++)=400;   Kp(i++)=1000; Kp(i++)=2000;  Kp(i++)=1800;  Kp(i++)=2000;
+	  Kp(i++)=1000;  Kp(i++)=400;  Kp(i++)=1000;  Kp(i++)=2000;  Kp(i++)=1800;
+	  Kp(i++)=2000;  Kp(i++)=1000; Kp(i++)=500;  Kp(i++)=250;  Kp(i++)=200;
+	  Kp(i++)=200;   Kp(i++)=300;  Kp(i++)=300;  Kp(i++)=200;  Kp(i++)=400;
+	  Kp(i++)=400;   Kp(i++)=200;  Kp(i++)=200;  Kp(i++)=300;  Kp(i++)= 300;
+	  Kp(i++)=200;   Kp(i++)=400;  Kp(i++)=400;  Kp(i++)=200;  Kp(i++)=200;
+
+	  i=0;
+	  Kd(i++)=40;  Kd(i++)=100;  Kd(i++)=200;  Kd(i++)=180;  Kd(i++)=200;
+	  Kd(i++)=100; Kd(i++)=40;   Kd(i++)=100;  Kd(i++)=200;  Kd(i++)=180;
+	  Kd(i++)=200; Kd(i++)=100;  Kd(i++)=50;   Kd(i++)=25;   Kd(i++)=20;
+	  Kd(i++)=20;  Kd(i++)=30;   Kd(i++)=30;   Kd(i++)=20;   Kd(i++)=40;
+	  Kd(i++)=40;  Kd(i++)=20;   Kd(i++)=20;   Kd(i++)=30;   Kd(i++)= 30;
+	  Kd(i++)=20;  Kd(i++)=40;   Kd(i++)=40;   Kd(i++)=20;   Kd(i++)=20;
+
+	  KpSIN = Kp;
+	  KdSIN = Kd;
+	}
+      else // high
+	{
+	  // High gains
+	  if( _dimension != 30 )
+	    { std::cerr << "Only working for dim=30!" << std::endl; return; }
+
+	  ml::Vector Kp(_dimension),Kd(_dimension);
+	  unsigned int i=0;
+	  Kp(i++)=4000;  Kp(i++)=10000; Kp(i++)=20000; Kp(i++)=18000;  Kp(i++)=20000;
+	  Kp(i++)=10000; Kp(i++)=4000;  Kp(i++)=10000; Kp(i++)=20000;  Kp(i++)=18000;
+	  Kp(i++)=20000; Kp(i++)=10000; Kp(i++)=5000;  Kp(i++)=2500;   Kp(i++)=2000;
+	  Kp(i++)=2000;  Kp(i++)=3000;  Kp(i++)=3000;  Kp(i++)=2000;   Kp(i++)=4000;
+	  Kp(i++)=4000;  Kp(i++)=2000;  Kp(i++)=2000;  Kp(i++)=3000;   Kp(i++)= 3000;
+	  Kp(i++)=2000;  Kp(i++)=4000;  Kp(i++)=4000;  Kp(i++)=2000;   Kp(i++)=2000;
+
+	  i=0;
+	  Kd(i++)=120;   Kd(i++)=300;   Kd(i++)=600;   Kd(i++)=500;    Kd(i++)=600;
+	  Kd(i++)=300;   Kd(i++)=120;   Kd(i++)=300;   Kd(i++)=600;    Kd(i++)=500;
+	  Kd(i++)=600;   Kd(i++)=300;   Kd(i++)=150;   Kd(i++)=75;     Kd(i++)=60;
+	  Kd(i++)=60;    Kd(i++)=90;    Kd(i++)=90;    Kd(i++)=60;     Kd(i++)=120;
+	  Kd(i++)=120;   Kd(i++)=60;    Kd(i++)=60;    Kd(i++)=90;     Kd(i++)= 90;
+	  Kd(i++)=60;    Kd(i++)=120;   Kd(i++)=120;   Kd(i++)=60;     Kd(i++)=60;
+
+	  KpSIN = Kp;
+	  KdSIN = Kd;
+	}
+    }
     /* --- ENTITY ----------------------------------------------------------- */
     /* --- ENTITY ----------------------------------------------------------- */
     /* --- ENTITY ----------------------------------------------------------- */
@@ -181,82 +270,12 @@ namespace sot
 	    }
 	}
       else if( cmdLine == "velocityonly" )
-	{
-	  ml::Vector zero(_dimension); zero.fill(0);
-	  positionSIN = zero;
-	  positionRefSIN = zero;
-	  KpSIN = zero;
-	}
+	{ setGainVelocityOnly(); }
       else if( cmdLine == "stdGain" )
 	{
 	  std::string config = "high";
 	  cmdArgs >> std::ws; if( cmdArgs.good() ) cmdArgs >> config;
-
-	  if( config =="low" )
-	    {
-	      // Low
-	      ml::Vector Kp(_dimension); Kp.fill(100);
-	      ml::Vector Kd(_dimension); Kp.fill(20);
-	      KpSIN = Kp;
-	      KdSIN = Kd;
-	    }
-	  else if( config =="medium" )
-	    {
-	      // Medium gains
-	      // Kp = [30](400,1000,2000,1800,2000,1000,400,1000,2000,1800,2000,1000,500,250,200,200,300,300,200,400,400,200,200,300, 300,200,400,400,200,200);
-	      // Kd = [30] (40,100,200,180,200,100,40,100,200,180,200,100,50,25,20,20,30,30,20,40,40,20,20,30, 30,20,40,40,20,20);
-	      if( _dimension != 30 )
-		{ os << "Only working for dim=30!" << std::endl; return; }
-
-	      ml::Vector Kp(_dimension),Kd(_dimension);
-	      unsigned int i=0;
-	      Kp(i++)=400;   Kp(i++)=1000; Kp(i++)=2000;  Kp(i++)=1800;  Kp(i++)=2000;
-	      Kp(i++)=1000;  Kp(i++)=400;  Kp(i++)=1000;  Kp(i++)=2000;  Kp(i++)=1800;
-	      Kp(i++)=2000;  Kp(i++)=1000; Kp(i++)=500;  Kp(i++)=250;  Kp(i++)=200;
-	      Kp(i++)=200;   Kp(i++)=300;  Kp(i++)=300;  Kp(i++)=200;  Kp(i++)=400;
-	      Kp(i++)=400;   Kp(i++)=200;  Kp(i++)=200;  Kp(i++)=300;  Kp(i++)= 300;
-	      Kp(i++)=200;   Kp(i++)=400;  Kp(i++)=400;  Kp(i++)=200;  Kp(i++)=200;
-
-	      i=0;
-	      Kd(i++)=40;  Kd(i++)=100;  Kd(i++)=200;  Kd(i++)=180;  Kd(i++)=200;
-	      Kd(i++)=100; Kd(i++)=40;   Kd(i++)=100;  Kd(i++)=200;  Kd(i++)=180;
-	      Kd(i++)=200; Kd(i++)=100;  Kd(i++)=50;   Kd(i++)=25;   Kd(i++)=20;
-	      Kd(i++)=20;  Kd(i++)=30;   Kd(i++)=30;   Kd(i++)=20;   Kd(i++)=40;
-	      Kd(i++)=40;  Kd(i++)=20;   Kd(i++)=20;   Kd(i++)=30;   Kd(i++)= 30;
-	      Kd(i++)=20;  Kd(i++)=40;   Kd(i++)=40;   Kd(i++)=20;   Kd(i++)=20;
-
-	      KpSIN = Kp;
-	      KdSIN = Kd;
-	    }
-	  else // high
-	    {
-	      // High gains
-	      // Kp = [30](4000,10000,20000,18000,20000,10000,4000,10000,20000,18000,20000,10000,5000,2500,2000,2000,3000,3000,2000,4000,4000,2000,2000,3000, 3000,2000,4000,4000,2000,2000);
-	      //Kd = [30](120,300,600,500,600,300,120,300,600,500,600,300,150,75,60,60,90,90,60,120,120,60,60,90, 90,60,120,120,60,60);
-
-	      if( _dimension != 30 )
-		{ os << "Only working for dim=30!" << std::endl; return; }
-
-	      ml::Vector Kp(_dimension),Kd(_dimension);
-	      unsigned int i=0;
-	      Kp(i++)=4000;  Kp(i++)=10000; Kp(i++)=20000; Kp(i++)=18000;  Kp(i++)=20000;
-	      Kp(i++)=10000; Kp(i++)=4000;  Kp(i++)=10000; Kp(i++)=20000;  Kp(i++)=18000;
-	      Kp(i++)=20000; Kp(i++)=10000; Kp(i++)=5000;  Kp(i++)=2500;   Kp(i++)=2000;
-	      Kp(i++)=2000;  Kp(i++)=3000;  Kp(i++)=3000;  Kp(i++)=2000;   Kp(i++)=4000;
-	      Kp(i++)=4000;  Kp(i++)=2000;  Kp(i++)=2000;  Kp(i++)=3000;   Kp(i++)= 3000;
-	      Kp(i++)=2000;  Kp(i++)=4000;  Kp(i++)=4000;  Kp(i++)=2000;   Kp(i++)=2000;
-
-	      i=0;
-	      Kd(i++)=120;   Kd(i++)=300;   Kd(i++)=600;   Kd(i++)=500;    Kd(i++)=600;
-	      Kd(i++)=300;   Kd(i++)=120;   Kd(i++)=300;   Kd(i++)=600;    Kd(i++)=500;
-	      Kd(i++)=600;   Kd(i++)=300;   Kd(i++)=150;   Kd(i++)=75;     Kd(i++)=60;
-	      Kd(i++)=60;    Kd(i++)=90;    Kd(i++)=90;    Kd(i++)=60;     Kd(i++)=120;
-	      Kd(i++)=120;   Kd(i++)=60;    Kd(i++)=60;    Kd(i++)=90;     Kd(i++)= 90;
-	      Kd(i++)=60;    Kd(i++)=120;   Kd(i++)=120;   Kd(i++)=60;     Kd(i++)=60;
-
-	      KpSIN = Kp;
-	      KdSIN = Kd;
-	    }
+	  setStandardGains( config );
 	}
       else
 	{