diff --git a/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseApiManager.java b/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseApiManager.java
index 085aef8..e4c3bcc 100644
--- a/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseApiManager.java
+++ b/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseApiManager.java
@@ -10,8 +10,6 @@
 import com.mifos.apache.fineract.data.services.LoanService;
 import com.mifos.apache.fineract.data.services.RolesService;
 
-import java.util.concurrent.TimeUnit;
-
 import okhttp3.OkHttpClient;
 import okhttp3.logging.HttpLoggingInterceptor;
 import retrofit2.Retrofit;
@@ -61,24 +59,13 @@
 
     private static void createService(Context context) {
 
-        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
-        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
-
-        OkHttpClient okHttpClient = new OkHttpClient.Builder()
-                .addInterceptor(new MifosInterceptor(context))
-                .addInterceptor(new ReceivedCookiesInterceptor(context))
-                .addInterceptor(interceptor)
-                .connectTimeout(60, TimeUnit.SECONDS)
-                .readTimeout(60, TimeUnit.SECONDS)
-                .build();
-
         retrofit = new Retrofit.Builder()
                 .baseUrl(BaseUrl.getDefaultBaseUrl())
                 .addConverterFactory(new NullOnEmptyConverterFactory())
                 .addConverterFactory(ScalarsConverterFactory.create())
                 .addConverterFactory(GsonConverterFactory.create())
                 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
-                .client(okHttpClient)
+                .client(new MifosOkHttpClient(context).getMifosOkHttpClient())
                 .build();
         init();
     }
diff --git a/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseUrl.java b/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseUrl.java
index 459272a..2268b20 100755
--- a/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseUrl.java
+++ b/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseUrl.java
@@ -10,7 +10,7 @@
  */
 public class BaseUrl {
 
-    public static final String PROTOCOL_HTTPS = "http://";
+    public static final String PROTOCOL_HTTPS = "https://";
     public static final String API_ENDPOINT = "pilot.kuelap.io";
     public static final String PORT = "80";
     // "/" in the last of the base url always
diff --git a/app/src/main/java/com/mifos/apache/fineract/data/remote/MifosOkHttpClient.java b/app/src/main/java/com/mifos/apache/fineract/data/remote/MifosOkHttpClient.java
new file mode 100644
index 0000000..b985746
--- /dev/null
+++ b/app/src/main/java/com/mifos/apache/fineract/data/remote/MifosOkHttpClient.java
@@ -0,0 +1,108 @@
+package com.mifos.apache.fineract.data.remote;
+
+import android.content.Context;
+
+import java.security.KeyStore;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+import okhttp3.logging.HttpLoggingInterceptor.Level;
+
+public class MifosOkHttpClient {
+
+    private Context context;
+
+    public MifosOkHttpClient(Context context) {
+        this.context = context;
+    }
+
+    public OkHttpClient getMifosOkHttpClient() {
+
+        OkHttpClient.Builder builder = new OkHttpClient.Builder();
+
+        try {
+            // Create a trust manager that does not validate certificate chains
+            TrustManager[] trustAllCerts = {
+                    new X509TrustManager() {
+                        @Override
+                        public void checkClientTrusted(
+                                X509Certificate[] chain,
+                                String authType) throws CertificateException {
+                        }
+
+                        @Override
+                        public void checkServerTrusted(
+                                X509Certificate[] chain,
+                                String authType) throws CertificateException {
+                        }
+
+                        @Override
+                        public X509Certificate[] getAcceptedIssuers() {
+                            return new X509Certificate[0];
+                        }
+                    }
+            };
+
+            // Install the all-trusting trust manager
+            SSLContext sslContext = SSLContext.getInstance("SSL");
+            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
+            // Create an ssl socket factory with our all-trusting manager
+            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
+
+            //Enable Full Body Logging
+            HttpLoggingInterceptor logger = new HttpLoggingInterceptor();
+            logger.setLevel(Level.BODY);
+
+            TrustManagerFactory trustManagerFactory = TrustManagerFactory.
+                    getInstance(TrustManagerFactory.getDefaultAlgorithm());
+            trustManagerFactory.init((KeyStore) null);
+            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
+            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
+                throw new IllegalStateException("Unexpected default trust managers:" + Arrays.
+                        toString(trustManagers));
+            }
+            X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
+
+            //Set SSL certificate to OkHttpClient Builder
+
+            builder.sslSocketFactory(sslSocketFactory, trustManager);
+
+            builder.hostnameVerifier(new HostnameVerifier() {
+                @Override
+                public boolean verify(String hostname, SSLSession session) {
+                    return true;
+                }
+            });
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        //Enable Full Body Logging
+        HttpLoggingInterceptor logger = new HttpLoggingInterceptor();
+        logger.setLevel(Level.BODY);
+
+        //Setting Timeout 30 Seconds
+        builder.connectTimeout(60, TimeUnit.SECONDS);
+        builder.readTimeout(60, TimeUnit.SECONDS);
+
+        //Interceptor :> Full Body Logger and ApiRequest Header
+        builder.addInterceptor(logger);
+        builder.addInterceptor(new MifosInterceptor(context));
+        builder.addInterceptor(new ReceivedCookiesInterceptor(context));
+
+        return builder.build();
+
+    }
+}
\ No newline at end of file
