diff --git a/src/mpin_sdk.cpp b/src/mpin_sdk.cpp
index 9f42e9b..3652767 100644
--- a/src/mpin_sdk.cpp
+++ b/src/mpin_sdk.cpp
@@ -752,7 +752,7 @@
     return UserPtr(new User(id, deviceName));
 }
 
-Status MPinSDK::StartRegistration(UserPtr user, const String& userData)
+Status MPinSDK::StartRegistration(UserPtr user, const String& activateCode, const String& userData)
 {
     Status s = CheckIfBackendIsSet();
     if(s != Status::OK)
@@ -766,7 +766,7 @@
         return s;
     }
 
-    return RequestRegistration(user, userData);
+    return RequestRegistration(user, activateCode, userData);
 }
 
 Status MPinSDK::RestartRegistration(UserPtr user, const String& userData)
@@ -783,10 +783,10 @@
         return s;
     }
 
-    return RequestRegistration(user, userData);
+    return RequestRegistration(user, "", userData);
 }
 
-Status MPinSDK::RequestRegistration(UserPtr user, const String& userData)
+Status MPinSDK::RequestRegistration(UserPtr user, const String& activateCode, const String& userData)
 {
     // Make request to RPA to add M-Pin ID
     util::JsonObject data;
@@ -800,6 +800,10 @@
     {
         data["userData"] = json::String(userData);
     }
+	if(!activateCode.empty())
+	{
+		data["activateCode"] = json::String(activateCode);
+	}
 
     String url;
     if(user->GetState() == User::STARTED_REGISTRATION)
@@ -854,45 +858,6 @@
     return Status(Status::OK);
 }
 
-Status MPinSDK::VerifyUser(UserPtr user, const String& mpinId, const String &  activationKey)
-{
-    Status s = CheckIfBackendIsSet();
-    if(s != Status::OK)
-    {
-        return s;
-    }
-
-    s = CheckUserState(user, User::INVALID);
-    if(s != Status::OK)
-    {
-        return s;
-    }
-    
-    String url = m_clientSettings.GetStringParam("mobileVerifyURL");
-    
-    util::JsonObject body;
-    body["mpin_id"] = json::String(mpinId);
-    body["activate_key"] = json::String(activationKey);
-    
-    HttpResponse response = MakeRequest(url, IHttpRequest::POST, body);
-    
-    if(response.GetStatus() != HttpResponse::HTTP_OK)
-    {
-        Status s;
-        s.SetStatusCode(Status::IDENTITY_NOT_VERIFIED);
-        s.SetErrorMessage("Identity not verified");
-        return s;
-    }
-
-    String regOTT = response.GetJsonData().GetStringParam("regOTT");
-
-    user->SetStartedRegistration(mpinId, regOTT);
-    AddUser(user);
-    s = WriteUsersToStorage();
-    
-    return s;
-}
-
 Status MPinSDK::ConfirmRegistration(INOUT UserPtr user, const String& pushMessageIdentifier)
 {
     Status s = CheckIfBackendIsSet();
diff --git a/src/mpin_sdk.h b/src/mpin_sdk.h
index d7cf2e7..7644c83 100644
--- a/src/mpin_sdk.h
+++ b/src/mpin_sdk.h
@@ -232,9 +232,8 @@
     Status SetBackend(const String& server, const String& rpsPrefix = MPinSDK::DEFAULT_RPS_PREFIX);
     UserPtr MakeNewUser(const String& id, const String& deviceName = "") const;
 
-    Status StartRegistration(INOUT UserPtr user, const String& userData = "");
+    Status StartRegistration(INOUT UserPtr user, const String& activateCode = "", const String& userData = "");
     Status RestartRegistration(INOUT UserPtr user, const String& userData = "");
-    Status VerifyUser(INOUT UserPtr user, const String& mpinId, const String& activationKey);
     Status ConfirmRegistration(INOUT UserPtr user, const String& pushMessageIdentifier = "");
     Status FinishRegistration(INOUT UserPtr user, const String& pin);
 
@@ -339,7 +338,7 @@
     HttpResponse MakeGetRequest(const String& url, HttpResponse::DataType expectedResponseType = HttpResponse::JSON) const;
     Status RewriteRelativeUrls();
     Status GetClientSettings(const String& backend, const String& rpsPrefix, OUT util::JsonObject *clientSettings) const;
-    Status RequestRegistration(INOUT UserPtr user, const String& userData);
+    Status RequestRegistration(INOUT UserPtr user, const String& activateCode, const String& userData);
     Status FinishAuthenticationImpl(INOUT UserPtr user, const String& pin, const String& accessNumber, OUT String *otp, OUT util::JsonObject& authResultData);
     Status GetCertivoxTimePermitShare(INOUT UserPtr user, const util::JsonObject& cutomerTimePermitData, OUT String& resultTimePermit);
     bool ValidateAccessNumber(const String& accessNumber);
diff --git a/tests/linux/MPinClient/HttpRequest.cpp b/tests/linux/MPinClient/HttpRequest.cpp
index a267e9f..b80ef91 100644
--- a/tests/linux/MPinClient/HttpRequest.cpp
+++ b/tests/linux/MPinClient/HttpRequest.cpp
@@ -29,15 +29,11 @@
 
 void CHttpRequest::SetHeaders(const StringMap& headers)
 {
-	CMapHttpHeaders tmpHeaders;
-	
 	StringMap::const_iterator itr = headers.begin();
 	for ( ; itr != headers.end(); ++itr )
 	{
-		tmpHeaders[itr->first] = itr->second;
+		m_requestHeaders[itr->first] = itr->second;
 	}
-
-	m_request.SetHeaders( tmpHeaders );
 }
 
 void CHttpRequest::SetQueryParams(const StringMap& queryParams)
@@ -75,6 +71,13 @@
 		return false;
 	}
 	
+	if (m_requestHeaders.find("X-MIRACL-OS-Class") == m_requestHeaders.end())
+	{
+		m_requestHeaders["X-MIRACL-OS-Class"] = "linux";
+	}
+	
+	m_request.SetHeaders( m_requestHeaders );
+
 	String fullUrl = url;
 	
 	if ( !m_queryParams.empty() )
@@ -90,7 +93,7 @@
 		fullUrl.TrimRight("&");
 	}
 	
-//	printf( "--> %s %s [%s]\n", strMethod.c_str(), fullUrl.c_str(), m_requestData.c_str() );
+	printf( "--> %s %s [%s]\n", strMethod.c_str(), fullUrl.c_str(), m_requestData.c_str() );
 
 	m_request.SetMethod( cvHttpMethod );
 	m_request.SetUrl( fullUrl );
@@ -111,7 +114,7 @@
 
 	m_responseData = m_request.GetResponse();
 	
-//	printf( "<-- %ld [%s]\n", m_request.GetResponseCode(), m_responseData.c_str() );
+	printf( "<-- %ld [%s]\n", m_request.GetResponseCode(), m_responseData.c_str() );
 
 	return true;
 }
diff --git a/tests/linux/MPinClient/HttpRequest.h b/tests/linux/MPinClient/HttpRequest.h
index 2f41cd6..5a2d6d7 100644
--- a/tests/linux/MPinClient/HttpRequest.h
+++ b/tests/linux/MPinClient/HttpRequest.h
@@ -50,6 +50,7 @@
 	String			m_id;
 	
 	CvHttpRequest	m_request;
+	CMapHttpHeaders m_requestHeaders;
 	String			m_requestData;	//Used for debugging purposes only	
 	StringMap		m_queryParams;
 	Seconds			m_timeout;
diff --git a/tests/linux/MPinClient/MpinClient.cpp b/tests/linux/MPinClient/MpinClient.cpp
index bda5a34..c0e1f62 100644
--- a/tests/linux/MPinClient/MpinClient.cpp
+++ b/tests/linux/MPinClient/MpinClient.cpp
@@ -57,7 +57,7 @@
 	file << data;
 	file.close();
 	
-	LogMessage( enLogLevel_Debug1, "Writing data to [%s]:\n%s", m_fileName.c_str(), data.c_str() );
+	LogMessage( enLogLevel_Debug3, "Writing data to [%s]:\n%s", m_fileName.c_str(), data.c_str() );
 	
 	return true;
 }
@@ -71,7 +71,7 @@
 	
 	data = buffer.str();
 	
-	LogMessage( enLogLevel_Debug1, "Reading data from [%s]:\n%s", m_fileName.c_str(), data.c_str() );
+	LogMessage( enLogLevel_Debug3, "Reading data from [%s]:\n%s", m_fileName.c_str(), data.c_str() );
 	
 	return true;
 }
@@ -89,8 +89,8 @@
 	_Init(aBackendUrl);	
 }
 
-CMpinClient::CMpinClient( int aClientId, const String& aBackendUrl, const String& aUserId, const String& aPinGood, const String& aPinBad ) :
-	m_bInitialized(false), m_id(aClientId), m_userId(aUserId), m_pinGood(aPinGood), m_pinBad(aPinBad),
+CMpinClient::CMpinClient( int aClientId, const String& aBackendUrl, const String& aUserId, const String& aPinGood, const String& aPinBad, const String& aRegOTC ) :
+	m_bInitialized(false), m_id(aClientId), m_userId(aUserId), m_pinGood(aPinGood), m_pinBad(aPinBad), m_regOTC(aRegOTC),
 	m_storageSecure( String().Format("sec-%d", aClientId) ), m_storageNonSecure( String().Format("%d", aClientId) ),
 	m_context( String().Format("%d",aClientId), &m_storageSecure, &m_storageNonSecure ),
 	m_thread(aUserId), m_queue(aUserId.c_str()), m_bIdle(false), m_bStatsEnabled(true)
@@ -175,7 +175,7 @@
 	GetCurrentTime(now);
 	Millisecs startTime = now.ToMillisecs();
 
-	MPinSDK::Status status = m_sdk.StartRegistration( user, "{ \"data\": \"test\" }" );
+	MPinSDK::Status status = m_sdk.StartRegistration( user, m_regOTC, "{ \"data\": \"test\" }" );
 	
 	if ( status != MPinSDK::Status::OK )
 	{
diff --git a/tests/linux/MPinClient/MpinClient.h b/tests/linux/MPinClient/MpinClient.h
index c5f55ce..2c61108 100644
--- a/tests/linux/MPinClient/MpinClient.h
+++ b/tests/linux/MPinClient/MpinClient.h
@@ -35,7 +35,7 @@
 {
 public:
 
-	CMpinClient( int aClientId, const String& aBackendUrl, const String& aUserId, const String& aPinGood, const String& aPinBad );
+	CMpinClient( int aClientId, const String& aBackendUrl, const String& aUserId, const String& aPinGood, const String& aPinBad, const String& aRegOTC = "" );
 	CMpinClient( int aClientId, const String& aBackendUrl, const String& aUserId );
 
 	virtual ~CMpinClient();
@@ -126,6 +126,8 @@
 	String		m_pinGood;
 	String		m_pinBad;
 	
+	String		m_regOTC;
+	
 	enum enEvent_t
 	{
 		enEvent_Register,
diff --git a/tests/linux/MPinClient/main.cpp b/tests/linux/MPinClient/main.cpp
index 5c0c979..81cea31 100644
--- a/tests/linux/MPinClient/main.cpp
+++ b/tests/linux/MPinClient/main.cpp
@@ -40,7 +40,7 @@
 	{
 		printf("%s\n", aMessage);
 	}
-	printf("Usage: %s --reg --auth -n <num-of-clients> -r <requests-per-second> [-u <user-prefix> -t <timeout-sec> -c <count>] -b <backend-url>\n", aExeName);
+	printf("Usage: %s --reg --auth -n <num-of-clients> -r <requests-per-second> [-u <user-id> -t <timeout-sec> -c <count> -o <reg-otc>] -b <backend-url>\n", aExeName);
 	printf("\n");
 }
 
@@ -48,7 +48,7 @@
 {
 	sParams() :
 		bRegister(false), bAuthenticate(false), numOfClients(0), requestsPerSecond(0),
-		count(1), userPrefix("test"), timeout(30)
+		count(1), userId("test%d@dispostable.com"), timeout(30)
 	{}
 
 	bool		bRegister;
@@ -57,8 +57,9 @@
 	uint32_t	requestsPerSecond;
 	uint32_t	count;
 	::String	backendUrl;
-	::String	userPrefix;
+	::String	userId;
 	Seconds		timeout;
+	::String	regOTC;
 };
 
 bool doargs(int argc, char **argv, OUT sParams& aParams)
@@ -81,7 +82,7 @@
 	};
 	int option_index = 0;
 
-	while ((ch = getopt_long(argc, argv, "n:r:b:u:t:c:", long_options, &option_index)) > 0)
+	while ((ch = getopt_long(argc, argv, "n:r:b:u:t:c:o:", long_options, &option_index)) > 0)
 	{
 		switch (ch)
 		{
@@ -91,7 +92,7 @@
 				break;
 			case 'b': aParams.backendUrl = optarg;
 				break;
-			case 'u': aParams.userPrefix = optarg;
+			case 'u': aParams.userId = optarg;
 				break;
 			case 't': aParams.timeout = atoi(optarg);
 				break;
@@ -101,6 +102,8 @@
 				break;
 			case 2: aParams.bAuthenticate = true;
 				break;
+			case 'o': aParams.regOTC = optarg;
+				break;
 		}
 	}
 
@@ -158,7 +161,7 @@
 
 int main(int argc, char** argv)
 {
-	InitLogger(argv[0], enLogLevel_Info);
+	InitLogger(argv[0], enLogLevel_Debug1);
 	LogMessage(enLogLevel_Info, "========== Starting M-Pin Client Test ==========");
 
 	sParams params;
@@ -195,7 +198,15 @@
 	for (int i = 0; i < params.numOfClients; ++i)
 	{
 		::String userId;
-		userId.Format("%s%d@dispostable.com", params.userPrefix.c_str(), i + 1);
+		if ( params.userId.find("%d") != ::String::npos )
+		{
+			userId.Format( params.userId.c_str(), i + 1 );
+		}
+		else
+		{
+			userId = params.userId;
+		}
+	
 
 		CMpinClient* pClient = NULL;
 
@@ -209,7 +220,7 @@
 				pinBad.Format("%04d", rand() % 10000);
 			}
 
-			pClient = new CMpinClient(i + 1, params.backendUrl, userId, pinGood, pinBad);
+			pClient = new CMpinClient(i + 1, params.backendUrl, userId, pinGood, pinBad, params.regOTC);
 		}
 		else
 		{
