diff --git a/src/cam.cpp b/src/cam.cpp
index 561194c0c2dbe218e5ed08f747cc1d387ba22d03..44665f65f1335343033e4174d98a79f623467609 100644
--- a/src/cam.cpp
+++ b/src/cam.cpp
@@ -1,4 +1,5 @@
 #include "cam.h"
+#include "VmbC/VmbCommonTypes.h"
 #include "iprinter.h"
 #include "utils.h"
 #include "frameobserver.h"
@@ -198,7 +199,7 @@ void Cam::stopRecording()
 	if(_state != recording)
 		return error("cant stop recording, when cam is " + stateToString(_state));
 
-	_timer->stop();
+	_timer->stop(); //stop timer or it will try to close an already closed cam
 
 	FeaturePtr pFeature;
 	try
@@ -297,3 +298,33 @@ void Cam::onChanged(UpdateTriggerType type)
 			error("onChanged: unknown trigger type");
 	}
 }
+
+//write out settings.xml for current open cam
+void Cam::saveSettings()
+{
+	if(_state != opened)
+		return error("can only save settings on opened cam. (its " + stateToString(_state) + ")");
+
+	// VmbFilePathChar_t* = wchar_t* > std::wstring
+	// auto file = L"settings_" + name().toStdWString() + L".xml";
+	std::wstring file = L"settings_" + name().toStdWString() + L".xml";
+
+	VmbFeaturePersistSettings_t settingsStruct;
+	settingsStruct.loggingLevel = VmbLogLevelWarn; //err/warn/dbg
+	settingsStruct.maxIterations = 5;
+	settingsStruct.persistType = VmbFeaturePersistNoLUT; //?
+
+	if (f(_cam->SaveSettings( (const VmbFilePathChar_t*)file.c_str() , &settingsStruct ) ))
+		error( "Could not save camera settings to '" + QString::fromStdWString(file) + "'" );
+
+}
+
+//load settings.xml for current open cam
+void Cam::loadSettings()
+{
+	if(_state != opened)
+		return error("can only save settings on opened cam. (its " + stateToString(_state) + ")");
+
+	if(f(_cam->LoadSettings( (const VmbFilePathChar_t *) settingsFile().toStdWString().c_str())))
+		error( "Could not load camera settings from '" + settingsFile() + "'" );
+}
diff --git a/src/cam.h b/src/cam.h
index 64698ecd91e190c61e2e11afb00a3b5230a57b1e..be9686aaf7da27609cdaca09b6a4b1c41a38c39f 100644
--- a/src/cam.h
+++ b/src/cam.h
@@ -58,6 +58,10 @@ public:
 	void startRecording(minutes dur);
 	void startRecording(seconds dur); //can use literals "1s, 1min"
 	QString info();
+
+	void saveSettings();
+	void loadSettings();
+
 	inline CameraPtr getCameraPtr() { return _cam; }
 	inline void setCameraPtr( CameraPtr pCamera ) { _cam = pCamera; }
 
diff --git a/src/cmd/console.cpp b/src/cmd/console.cpp
index 1a8dfcb340a32a199ac7c6162d1f16d506289b46..f20416fa045b38e9bf7d1f75f0c25d0053b4a687 100644
--- a/src/cmd/console.cpp
+++ b/src/cmd/console.cpp
@@ -97,6 +97,8 @@ void Console::printHelp()
 	<< "s: stop recording"
 	<< "l: list available cameras"
 	<< "k: deteKt cameras"
+	<< "y: load cam settings"
+	<< "u: save cam settings"
 	<< "v: print versions"
 	<< "q: quit"
 	// XXX add new func
@@ -167,6 +169,14 @@ void Controller::onKeyPressed(const QChar& key)
 			emit stopRecording();
 			break;
 
+		case 'y':
+			emit loadSettings();
+			break;
+
+		case 'u':
+			emit saveSettings();
+			break;
+
 		case 'v':
 			console->printVersion();
 			break;
diff --git a/src/cmd/console.h b/src/cmd/console.h
index bb680ab637f7704307101e9e53b2318a78a19d32..c69aadcf8fa66b959efd032c86f3e091c4fdac23 100644
--- a/src/cmd/console.h
+++ b/src/cmd/console.h
@@ -37,7 +37,6 @@ signals:
 	void lineEntered(const QString&);
 	void numberEntered(const int&);
 
-
 };
 
 class Controller : public QObject
@@ -67,10 +66,10 @@ class Controller : public QObject
 		void startRecording();
 		void stopRecording();
 		void setDuration(int);
+		void loadSettings();
+		void saveSettings();
 
 		// void calibrateCam();
-		// void loadSettings();
-		// void storeSettings();
 		// ... more signals here, new func XXX
 
 	private:
diff --git a/src/cmd/main.cpp b/src/cmd/main.cpp
index 181527b846c4087146777c16cc1be5cf19a7aaa9..9581a1e6a51a842b0cca9d691f06cee3144dd78d 100644
--- a/src/cmd/main.cpp
+++ b/src/cmd/main.cpp
@@ -6,7 +6,6 @@
 #include "../cam.h"
 
 #include "qobjectdefs.h"
-// #include "qnamespace.h"
 #include <QCoreApplication>
 #include <QTimer>
 
@@ -17,10 +16,16 @@ int main(int argc, char *argv[])
 	QCoreApplication::setApplicationVersion(getVersion());
 	QCoreApplication::setApplicationName("recorder");
 
-	//parse arg
+	//parse args
 	QStringList arguments = a.arguments();
-	if (arguments.size()>=2)
-		configFile(arguments.at(1));
+	for (int i = 1; i < arguments.size(); ++i)
+	{
+		if (arguments.at(i).endsWith(".json"))
+			configFile(arguments.at(i));
+		else if (arguments.at(i).endsWith(".xml"))
+			settingsFile(arguments.at(i));
+	}
+
 	Controller controller;
 	Core core;
 
@@ -33,6 +38,8 @@ int main(int argc, char *argv[])
 	QObject::connect(&controller, &Controller::startRecording, 	&core, &Core::startRecording);
 	QObject::connect(&controller, &Controller::stopRecording,	&core, &Core::stopRecording);
 	QObject::connect(&controller, &Controller::setDuration, 		&core, &Core::setDuration);
+	QObject::connect(&controller, &Controller::loadSettings, 	&core, &Core::loadSettings);
+	QObject::connect(&controller, &Controller::saveSettings, 	&core, &Core::saveSettings);
 	// XXX add new func
 
 	QTimer::singleShot(0, Console::getInstance(), SLOT(printVersion()));
diff --git a/src/core.cpp b/src/core.cpp
index 4974c01666824c7c928ad2778f477f0132c6ca18..6278c52d91462c90be9b6078cebf0a1684c4d7c2 100644
--- a/src/core.cpp
+++ b/src/core.cpp
@@ -168,3 +168,15 @@ void Core::setDuration(int dur)
 {
 	_recDuration = seconds(dur);
 }
+
+void Core::loadSettings()
+{
+	if( cam() )
+		cam()->loadSettings();
+}
+
+void Core::saveSettings()
+{
+	if( cam() )
+		cam()->saveSettings();
+}
diff --git a/src/core.h b/src/core.h
index 239c100c87f8c6b96ec7f6fe948460f8ea0fe6da..f3929c859e9926b565d9c792d88bb48262f71376 100644
--- a/src/core.h
+++ b/src/core.h
@@ -31,12 +31,14 @@ public slots:
 	void onCameraChanged(CameraPtr,UpdateTriggerType);
 	void openCam();
 	void closeCam();
+	void loadSettings();
+	void saveSettings();
 	// XXX add new func
 
 	CamPtr cam(const unsigned long &idx=-1);
 
 	void startRecording();
-	void stopRecording(); //XXX also stop singleshot-timer or it will try to close an already closed cam
+	void stopRecording();
 	void setDuration(int);
 
 private slots:
diff --git a/src/utils.cpp b/src/utils.cpp
index a802e76f8656542c7c2c98b670bfb3d3a9990050..0b08dd9e3497f80f35220f7d2b27fe3f1e8d01ff 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -144,8 +144,8 @@ void parseConfig(QList<QPair<QString,QString>>& parsedCameras)
 	QFile file(configFile());
 	if (!file.open(QIODevice::ReadOnly))
 	{
-		qWarning() << "Failed";
-		return;
+		qWarning() << "Failed. Could not open " + configFile();
+		exit(VmbErrorNotFound);
 	}
 
 	QByteArray jsonData = file.readAll();
@@ -189,21 +189,36 @@ void parseConfig(QList<QPair<QString,QString>>& parsedCameras)
 	// }
 }
 
+// needed to find cams via ip
 QString configFile(QString filename)
 {
-	static QString _filename;
-	if( _filename.isEmpty() )
+	static QString _configFile;
+	if( _configFile.isEmpty() )
 	{
 		if(filename.isEmpty())
 		{
-			_filename = QCoreApplication::applicationDirPath() + "/test.json" ;
+			_configFile = QCoreApplication::applicationDirPath() + "/config.json" ; //default
 		}
 		else
 		{
-			_filename = filename;
+			_configFile = filename;
 		}
 	}
-	return _filename;
+	return _configFile;
 }
 
+// optional - only set cam settings when they changed
+QString settingsFile(QString filename)
+{
+	static QString _settingsFile;
+	if( _settingsFile.isEmpty() )
+	{
+		_settingsFile = filename;
+
+		if(filename.isEmpty())
+			QCoreApplication::applicationDirPath() + "/settings.xml" ; //default
+
+	}
+	return _settingsFile;
+}
 
diff --git a/src/utils.h b/src/utils.h
index f91e1de5a18e3002efb8bfbc426726c86d747928..53db0eb0d2ed2db9ea4007205964cd766f68d240 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -11,6 +11,7 @@ class QDir;
 
 void parseConfig(QList<QPair<QString,QString>>& parsedCameras);
 QString configFile(QString filename="");
+QString settingsFile(QString filename="");
 
 const QStringList getVersions();
 const QString getVersion();