diff --git a/linphone/gtk-glade/linphone.h b/linphone/gtk-glade/linphone.h
index 4f025ab098f60c61b64b07c79ba8f976ab5578b5..add59422328be6c35d4049da87c7bb51f693b50a 100644
--- a/linphone/gtk-glade/linphone.h
+++ b/linphone/gtk-glade/linphone.h
@@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define PACKAGE_DATA_DIR "./"
 
 #ifndef LINPHONE_VERSION
-#define LINPHONE_VERSION "3.1.0-20090401"
+#define LINPHONE_VERSION "3.1.0-20090402"
 #endif
 
 #endif
diff --git a/linphone/mediastreamer2/plugins/msdscap/mdscap.cc b/linphone/mediastreamer2/plugins/msdscap/mdscap.cc
index 480acb6a65af25b7ea5ea860f7abc6f99dbd710d..99ec9a520cc0e0738c5336504080d4b3feb80bce 100755
--- a/linphone/mediastreamer2/plugins/msdscap/mdscap.cc
+++ b/linphone/mediastreamer2/plugins/msdscap/mdscap.cc
@@ -1,3 +1,27 @@
+/* msdscap - mediastreamer2 plugin for video capture using directshow 
+   Copyright (C) 2009 Simon Morlat
+
+   This program 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 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. 
+*/
+/* 
+This plugin has been written by Simon Morlat based on the work made by
+Jan Wedekind, posted on mingw tracker here:
+http://sourceforge.net/tracker/index.php?func=detail&aid=1819367&group_id=2435&atid=302435
+He wrote all the declarations missing to get directshow capture working
+with mingw, and provided a demo code that worked great with minimal code.
+*/
+
 // This is a DirectShow interface. But maybe you'll find that it's easier to
 // access the camera directly ;)
 
@@ -32,7 +56,7 @@
 #include <mediastreamer2/msticker.h>
 #include <mediastreamer2/msvideo.h>
 
-#define FILTER_NAME L"HornetsEye Capture Filter"
+#define FILTER_NAME L"Mediasatreamer2 plugin for video capture"
 #define PIN_NAME L"Capture"
 
 using namespace Hornetseye;
@@ -477,8 +501,10 @@ public:
 		_start_time=0;
 		_frame_count=0;
 		_pixfmt=MS_YUV420P;
+		_ready=false;
 	}
 	virtual ~DSCapture(){
+		if (_ready) stopAndClean();
 		flushq(&_rq,0);
 		ms_mutex_destroy(&_mutex);
 	}
@@ -506,7 +532,8 @@ public:
 	void setFps(float fps){
 		_fps=fps;
 	}
-	MSPixFmt getPixFmt()const{
+	MSPixFmt getPixFmt(){
+		if (!_ready) createDshowGraph(); /* so that _pixfmt is updated*/
 		return _pixfmt;
 	}
 	void setDeviceIndex(int index){
@@ -515,6 +542,7 @@ public:
 protected:
   	long m_refCount;
 private:
+	int createDshowGraph();
 	int	selectBestFormat(ComPtr<IAMStreamConfig> streamConfig, int count);
 	int _devid;
 	MSVideoSize _vsize;
@@ -529,6 +557,7 @@ private:
 	ComPtr< IBaseFilter > _grabberBase;
 	ComPtr< IMediaControl > _mediaControl;
 	ComPtr< IMediaEvent > _mediaEvent;
+	bool _ready;
 };
 
 
@@ -702,8 +731,9 @@ int DSCapture::selectBestFormat(ComPtr<IAMStreamConfig> streamConfig, int count)
     return 0;
 }
 
-int DSCapture::startDshowGraph(){
+int DSCapture::createDshowGraph(){
 	ComPtr< ICreateDevEnum > createDevEnum;
+	
 	CoInitialize(NULL);
     createDevEnum.coCreateInstance( CLSID_SystemDeviceEnum,
                                     IID_ICreateDevEnum, "Could not create "
@@ -826,16 +856,24 @@ int DSCapture::startDshowGraph(){
         ms_error("Error requesting media control interface" );
 		return -1;
 	}
-    HRESULT r=_mediaControl->Run();
-	if (r!=S_OK && r!=S_FALSE){
-		ms_error("Error starting graph (%i)",r);
-	}
-    ms_message("Graph started");
     if (graphBuilder->QueryInterface( IID_IMediaEvent,
                                         (void **)&_mediaEvent )!=S_OK){
     	ms_error("Error requesting event interface" );
     	return -1;
 	}
+	_ready=true;
+}
+
+int DSCapture::startDshowGraph(){
+	if (!_ready) {
+		if (createDshowGraph()!=0) return -1;
+	}
+	HRESULT r=_mediaControl->Run();
+	if (r!=S_OK && r!=S_FALSE){
+		ms_error("Error starting graph (%i)",r);
+		return -1;
+	}
+	ms_message("Graph started");
 }
 
 void DSCapture::stopAndClean(){
@@ -850,6 +888,7 @@ void DSCapture::stopAndClean(){
 	_mediaControl.reset();
 	_mediaEvent.reset();
 	flushq(&_rq,0);
+	_ready=false;
 }
 
 bool DSCapture::isTimeToSend(uint64_t ticker_time){