diff --git a/pom.xml b/pom.xml
index 2f1a7d2..69755e4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -485,8 +485,15 @@
 				<dependency>
 						<groupId>org.openecomp.sdc.sdc-distribution-client</groupId>
 						<artifactId>sdc-distribution-client</artifactId>
-						<version>1.2.3</version>
+						<version>1.2.2</version>
 				</dependency>
+				<dependency>
+					<groupId>org.openecomp.sdc.sdc-tosca</groupId>
+					<artifactId>sdc-tosca</artifactId>
+					<version>1.2.2</version>
+				</dependency>
+				
+				
 		</dependencies>
 
 		<build>
@@ -497,6 +504,7 @@
 								<directory>src/test/resources</directory>
 								<excludes>
 										<exclude>**/*.jks</exclude>
+										<exclude>**/*.csar</exclude>
 								</excludes>
 								<filtering>true</filtering>
 						</testResource>
@@ -508,6 +516,14 @@
 								<filtering>false</filtering>
 								<targetPath>https</targetPath>
 						</testResource>
+					  <testResource>
+								<directory>src/test/resources/example/sdc</directory>
+								<includes>
+										<include>**.csar</include>
+								</includes>
+								<filtering>false</filtering>
+								<targetPath>example/sdc</targetPath>
+						</testResource>
 				</testResources>
 				<resources>
 						<resource>
diff --git a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/CsarHandlerException.java b/src/main/java/org/onap/clamp/clds/exception/sdc/controller/CsarHandlerException.java
new file mode 100644
index 0000000..16fd779
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/exception/sdc/controller/CsarHandlerException.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.exception.sdc.controller;
+
+/**
+ * Exception during Csar operations.
+ */
+public class CsarHandlerException extends Exception {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = -7628640776124409155L;
+
+    /**
+     * @param message
+     *            The message to dump
+     * @param cause
+     *            The Throwable cause object
+     */
+    public CsarHandlerException(final String message) {
+        super(message);
+    }
+
+    /**
+     * @param message
+     *            The message to dump
+     * @param cause
+     *            The Throwable cause object
+     */
+    public CsarHandlerException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java
new file mode 100644
index 0000000..56c8530
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java
@@ -0,0 +1,110 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.sdc.controller.installer;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException;
+import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
+import org.onap.clamp.clds.sdc.controller.SdcSingleController;
+import org.openecomp.sdc.api.notification.IArtifactInfo;
+import org.openecomp.sdc.api.notification.INotificationData;
+import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;
+import org.openecomp.sdc.tosca.parser.api.ISdcCsarHelper;
+import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException;
+import org.openecomp.sdc.tosca.parser.impl.SdcToscaParserFactory;
+
+/**
+ * CsarDescriptor that will be used to deploy in CLAMP.
+ */
+public class CsarHandler {
+
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcSingleController.class);
+    private IArtifactInfo artifactElement;
+    private String filePath;
+    private String controllerName;
+    private SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();
+    private ISdcCsarHelper sdcCsarHelper;
+    public static final String CSAR_TYPE = "TOSCA_CSAR";
+    private String csarPath;
+
+    public CsarHandler(INotificationData iNotif, String controller, String sdcCsarPath) throws CsarHandlerException {
+        this.csarPath = sdcCsarPath;
+        this.controllerName = controller;
+        this.artifactElement = searchForUniqueCsar(iNotif);
+        this.filePath = buildFilePathForCsar(artifactElement);
+    }
+
+    private String buildFilePathForCsar(IArtifactInfo artifactElement) {
+        return csarPath + "/" + controllerName + "/" + artifactElement.getArtifactName();
+    }
+
+    private IArtifactInfo searchForUniqueCsar(INotificationData iNotif) throws CsarHandlerException {
+        List<IArtifactInfo> serviceArtifacts = iNotif.getServiceArtifacts();
+        for (IArtifactInfo artifact : serviceArtifacts) {
+            if (artifact.getArtifactType().equals(CSAR_TYPE)) {
+                return artifact;
+            }
+        }
+        throw new CsarHandlerException("Unable to find a CSAR in the Sdc Notification");
+    }
+
+    public void save(IDistributionClientDownloadResult resultArtifact)
+            throws SdcArtifactInstallerException, SdcToscaParserException {
+        try {
+            logger.info("Writing CSAR file : " + artifactElement.getArtifactURL() + " UUID "
+                    + artifactElement.getArtifactUUID() + ")");
+            Path path = Paths.get(filePath);
+            Files.createDirectories(path.getParent());
+            Files.createFile(path);
+            try (FileOutputStream outFile = new FileOutputStream(filePath)) {
+                outFile.write(resultArtifact.getArtifactPayload(), 0, resultArtifact.getArtifactPayload().length);
+            }
+            sdcCsarHelper = factory.getSdcCsarHelper(filePath);
+        } catch (IOException e) {
+            throw new SdcArtifactInstallerException(
+                    "Exception caught when trying to write the CSAR on the file system to " + filePath, e);
+        }
+    }
+
+    public IArtifactInfo getArtifactElement() {
+        return artifactElement;
+    }
+
+    public String getFilePath() {
+        return filePath;
+    }
+
+    public ISdcCsarHelper getSdcCsarHelper() {
+        return sdcCsarHelper;
+    }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 3d56725..f626e1a 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -177,6 +177,7 @@
 clamp.config.sdc.InstanceID=X-ECOMP-InstanceID
 clamp.config.sdc.header.requestId = X-ECOMP-RequestID
 #
+clamp.config.sdc.csarFolder = /tmp/sdc-controllers
 #
 clamp.config.ui.location.default=classpath:/clds/templates/ui-location-default.json
 clamp.config.ui.alarm.default=classpath:/clds/templates/ui-alarm-default.json
diff --git a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java
new file mode 100644
index 0000000..4c3ab86
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java
@@ -0,0 +1,104 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.sdc.controller.installer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.att.aft.dme2.internal.apache.commons.io.IOUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.AfterClass;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException;
+import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.openecomp.sdc.api.notification.IArtifactInfo;
+import org.openecomp.sdc.api.notification.INotificationData;
+import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;
+import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException;
+
+public class CsarHandlerTest {
+
+    private static final String sdcFolder = "/tmp/csar-handler-tests";
+    private static final String csarArtifactName = "testArtifact.csar";
+
+    @AfterClass
+    public static void removeAllFiles() throws IOException {
+        // Do some cleanup
+        Path path = Paths.get(sdcFolder + "/test-controller/" + csarArtifactName);
+        Files.deleteIfExists(path);
+    }
+
+    @Test
+    public void testConstructor() throws CsarHandlerException {
+        IArtifactInfo serviceArtifact = Mockito.mock(IArtifactInfo.class);
+        Mockito.when(serviceArtifact.getArtifactType()).thenReturn(CsarHandler.CSAR_TYPE);
+        Mockito.when(serviceArtifact.getArtifactName()).thenReturn(csarArtifactName);
+        List<IArtifactInfo> servicesList = new ArrayList<>();
+        servicesList.add(serviceArtifact);
+        INotificationData iNotifData = Mockito.mock(INotificationData.class);
+        Mockito.when(iNotifData.getServiceArtifacts()).thenReturn(servicesList);
+        CsarHandler csar = new CsarHandler(iNotifData, "test-controller", sdcFolder);
+        assertEquals(sdcFolder + "/test-controller" + "/" + csarArtifactName, csar.getFilePath());
+    }
+
+    @Test(expected = CsarHandlerException.class)
+    public void testFailingConstructor() throws CsarHandlerException {
+        INotificationData iNotifData = Mockito.mock(INotificationData.class);
+        Mockito.when(iNotifData.getServiceArtifacts()).thenReturn(new ArrayList<>());
+        new CsarHandler(iNotifData, "test-controller", "/tmp/csar-handler-tests");
+        fail("Exception should have been raised");
+    }
+
+    @Test
+    public void testSave()
+            throws SdcArtifactInstallerException, SdcToscaParserException, CsarHandlerException, IOException {
+        IArtifactInfo serviceArtifact = Mockito.mock(IArtifactInfo.class);
+        Mockito.when(serviceArtifact.getArtifactType()).thenReturn(CsarHandler.CSAR_TYPE);
+        Mockito.when(serviceArtifact.getArtifactName()).thenReturn(csarArtifactName);
+        List<IArtifactInfo> servicesList = new ArrayList<>();
+        servicesList.add(serviceArtifact);
+        INotificationData iNotifData = Mockito.mock(INotificationData.class);
+        Mockito.when(iNotifData.getServiceArtifacts()).thenReturn(servicesList);
+        CsarHandler csar = new CsarHandler(iNotifData, "test-controller", "/tmp/csar-handler-tests");
+        IDistributionClientDownloadResult resultArtifact = Mockito.mock(IDistributionClientDownloadResult.class);
+        Mockito.when(resultArtifact.getArtifactPayload()).thenReturn(
+                IOUtils.toByteArray(ResourceFileUtil.getResourceAsStream("example/sdc/service-Simsfoimap0112.csar")));
+        csar.save(resultArtifact);
+        assertTrue((new File(sdcFolder + "/test-controller/" + csarArtifactName)).exists());
+        assertEquals(csarArtifactName, csar.getArtifactElement().getArtifactName());
+        assertNotNull(csar.getSdcCsarHelper());
+    }
+}
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
index adcd4d9..413cfe7 100644
--- a/src/test/resources/application.properties
+++ b/src/test/resources/application.properties
@@ -177,6 +177,7 @@
 clamp.config.sdc.InstanceID=X-ECOMP-InstanceID
 clamp.config.sdc.header.requestId = X-ECOMP-RequestID
 #
+clamp.config.sdc.csarFolder = /tmp/sdc-tests
 #
 clamp.config.ui.location.default=classpath:/clds/templates/ui-location-default.json
 clamp.config.ui.alarm.default=classpath:/clds/templates/ui-alarm-default.json
diff --git a/src/test/resources/example/sdc/service-Simsfoimap0112.csar b/src/test/resources/example/sdc/service-Simsfoimap0112.csar
new file mode 100644
index 0000000..160c8f2
--- /dev/null
+++ b/src/test/resources/example/sdc/service-Simsfoimap0112.csar
Binary files differ
