diff --git a/appc-common/src/main/java/org/openecomp/appc/exceptions/InvalidInputException.java b/appc-common/src/main/java/org/openecomp/appc/exceptions/InvalidInputException.java
index dff4564..e9bb0d1 100644
--- a/appc-common/src/main/java/org/openecomp/appc/exceptions/InvalidInputException.java
+++ b/appc-common/src/main/java/org/openecomp/appc/exceptions/InvalidInputException.java
@@ -1,31 +1,31 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.exceptions;
-
-public class InvalidInputException extends Exception {
-    public InvalidInputException(String message){
-        super(message);
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.exceptions;
+
+public class InvalidInputException extends Exception {
+    public InvalidInputException(String message){
+        super(message);
+    }
+}
diff --git a/appc-common/src/main/java/org/openecomp/appc/exceptions/InvalidStateException.java b/appc-common/src/main/java/org/openecomp/appc/exceptions/InvalidStateException.java
index 19c9e38..ceeb872 100644
--- a/appc-common/src/main/java/org/openecomp/appc/exceptions/InvalidStateException.java
+++ b/appc-common/src/main/java/org/openecomp/appc/exceptions/InvalidStateException.java
@@ -1,31 +1,31 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.exceptions;
-
-public class InvalidStateException extends Exception {
-    public InvalidStateException(String message) {
-        super(message);
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.exceptions;
+
+public class InvalidStateException extends Exception {
+    public InvalidStateException(String message) {
+        super(message);
+    }
+}
diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/LifecycleManager.java b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/LifecycleManager.java
index 352bf4b..50fb7ee 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/LifecycleManager.java
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/LifecycleManager.java
@@ -1,33 +1,33 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.lifecyclemanager;
-
-import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;
-import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;
-
-public interface LifecycleManager {
-    String getNextState(String vnfType, String currentState, String event)
-            throws NoTransitionDefinedException,LifecycleException;
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.lifecyclemanager;
+
+import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;
+import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;
+
+public interface LifecycleManager {
+    String getNextState(String vnfType, String currentState, String event)
+            throws NoTransitionDefinedException,LifecycleException;
+}
diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LCMResponse.java b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LCMResponse.java
index 13b2173..4d73dc5 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LCMResponse.java
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LCMResponse.java
@@ -1,36 +1,36 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.lifecyclemanager.objects;
-
-public enum LCMResponse {
-    INVALID_INPUT_PARAMETERS,
-    NO_STATE_CHANGE,
-    NO_TRANSITION_DEFINED,
-    VALID_TRANSITION;
-
-    public String toString(){
-        return this.name();
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.lifecyclemanager.objects;
+
+public enum LCMResponse {
+    INVALID_INPUT_PARAMETERS,
+    NO_STATE_CHANGE,
+    NO_TRANSITION_DEFINED,
+    VALID_TRANSITION;
+
+    public String toString(){
+        return this.name();
+    }
+}
diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LifecycleException.java b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LifecycleException.java
index 5d66900..613daa4 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LifecycleException.java
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LifecycleException.java
@@ -1,36 +1,36 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.lifecyclemanager.objects;
-
-public class LifecycleException extends Exception {
-    public final String currentState;
-    public final String event;
-
-    public LifecycleException(Exception e,String currentState,String event){
-        super(e);
-        this.currentState = currentState;
-        this.event = event;
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.lifecyclemanager.objects;
+
+public class LifecycleException extends Exception {
+    public final String currentState;
+    public final String event;
+
+    public LifecycleException(Exception e,String currentState,String event){
+        super(e);
+        this.currentState = currentState;
+        this.event = event;
+    }
+}
diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/NoTransitionDefinedException.java b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/NoTransitionDefinedException.java
index f6670eb..89616c2 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/NoTransitionDefinedException.java
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/NoTransitionDefinedException.java
@@ -1,36 +1,36 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.lifecyclemanager.objects;
-
-public class NoTransitionDefinedException extends Exception {
-    public final String currentState;
-    public final String event;
-
-    public NoTransitionDefinedException(String message,String currentState,String event){
-        super(message);
-        this.currentState = currentState;
-        this.event = event;
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.lifecyclemanager.objects;
+
+public class NoTransitionDefinedException extends Exception {
+    public final String currentState;
+    public final String event;
+
+    public NoTransitionDefinedException(String message,String currentState,String event){
+        super(message);
+        this.currentState = currentState;
+        this.event = event;
+    }
+}
diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/VNFOperationOutcome.java b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/VNFOperationOutcome.java
index 8d92e35..547ffc1 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/VNFOperationOutcome.java
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/VNFOperationOutcome.java
@@ -1,32 +1,32 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.lifecyclemanager.objects;
-
-public enum VNFOperationOutcome {
-    SUCCESS,FAILURE,EXPIRE;
-    public String toString(){
-        return this.name();
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.lifecyclemanager.objects;
+
+public enum VNFOperationOutcome {
+    SUCCESS,FAILURE,EXPIRE;
+    public String toString(){
+        return this.name();
+    }
+}
diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/main/java/org/openecomp/appc/lifecyclemanager/impl/LifecycleManagerImpl.java b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/java/org/openecomp/appc/lifecyclemanager/impl/LifecycleManagerImpl.java
index 890218e..b7acf98 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-core/src/main/java/org/openecomp/appc/lifecyclemanager/impl/LifecycleManagerImpl.java
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/java/org/openecomp/appc/lifecyclemanager/impl/LifecycleManagerImpl.java
@@ -1,102 +1,102 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.lifecyclemanager.impl;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.att.eelf.i18n.EELFResourceManager;
-import org.openecomp.appc.exceptions.InvalidInputException;
-import org.openecomp.appc.i18n.Msg;
-import org.openecomp.appc.lifecyclemanager.LifecycleManager;
-import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;
-import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;
-import org.openecomp.appc.statemachine.StateMachine;
-import org.openecomp.appc.statemachine.StateMetaDataReader;
-import org.openecomp.appc.statemachine.impl.StateMachineFactory;
-import org.openecomp.appc.statemachine.impl.readers.AppcOamMetaDataReader;
-import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader;
-import org.openecomp.appc.statemachine.objects.*;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class LifecycleManagerImpl implements LifecycleManager{
-
-    private StateMetaDataReader metadataReader;
-    private static Map<String,StateMachine> stateMachineMap = new ConcurrentHashMap<>();
-    private final EELFLogger logger = EELFManager.getInstance().getLogger(LifecycleManagerImpl.class);
-    private final EELFLogger errorLogger = EELFManager.getInstance().getErrorLogger();
-
-    @Override
-    public String getNextState(String vnfType, String currentState, String event) throws NoTransitionDefinedException,LifecycleException{
-        if (logger.isTraceEnabled()) {
-            logger.trace("Entering to getNextState with vnfType = "+ vnfType +    ", currentState = " + currentState + ", event = " + event);
-        }
-
-        State nextState;
-        StateMachine machine;
-        StateMachineResponse response;
-        try {
-            machine = this.getStateMachine(vnfType);
-            response = machine.handleEvent(new State(currentState),new Event(event));
-            if(Response.NO_TRANSITION_DEFINED.equals(response.getResponse())){
-                errorLogger.error(EELFResourceManager.format(Msg.VF_ILLEGAL_COMMAND, vnfType,event,currentState));
-                throw new NoTransitionDefinedException("No Transition Defined for currentState = " +  currentState + ", event = " + event,currentState,event);
-            }
-            nextState = response.getNextState();
-        } catch (InvalidInputException e) {
-            logger.error(e.getMessage());
-            throw new LifecycleException(e,currentState,event);
-        }
-        if (logger.isTraceEnabled()) {
-            logger.trace("Exiting from getNextState with (nextState = " + nextState.getStateName() + ")");
-        }
-        return nextState.getStateName();
-    }
-
-    private StateMachine getStateMachine(String vnfType){
-        if (logger.isTraceEnabled()) {
-            logger.trace("Entering to getNextState with vnfType = "+ vnfType);
-        }
-        if(vnfType == null){
-            vnfType = "DEFAULT";
-        }
-        StateMachine machine = stateMachineMap.get(vnfType);
-        if(machine == null){
-            metadataReader = getMetadataReader(vnfType);
-            StateMachineMetadata metadata = metadataReader.readMetadata();
-            machine = StateMachineFactory.getStateMachine(metadata);
-            stateMachineMap.put(vnfType,machine);
-        }
-
-        logger.trace("Exiting getStateMachine with StateMachine = " + stateMachineMap.get(vnfType).toString());
-        return stateMachineMap.get(vnfType);
-    }
-
-    private StateMetaDataReader getMetadataReader(String vnfType) {
-        return vnfType.equals("APPC") ? new AppcOamMetaDataReader() : new VnfMetaDataReader();
-    }
-
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.lifecyclemanager.impl;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.att.eelf.i18n.EELFResourceManager;
+import org.openecomp.appc.exceptions.InvalidInputException;
+import org.openecomp.appc.i18n.Msg;
+import org.openecomp.appc.lifecyclemanager.LifecycleManager;
+import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;
+import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;
+import org.openecomp.appc.statemachine.StateMachine;
+import org.openecomp.appc.statemachine.StateMetaDataReader;
+import org.openecomp.appc.statemachine.impl.StateMachineFactory;
+import org.openecomp.appc.statemachine.impl.readers.AppcOamMetaDataReader;
+import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader;
+import org.openecomp.appc.statemachine.objects.*;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class LifecycleManagerImpl implements LifecycleManager{
+
+    private StateMetaDataReader metadataReader;
+    private static Map<String,StateMachine> stateMachineMap = new ConcurrentHashMap<>();
+    private final EELFLogger logger = EELFManager.getInstance().getLogger(LifecycleManagerImpl.class);
+    private final EELFLogger errorLogger = EELFManager.getInstance().getErrorLogger();
+
+    @Override
+    public String getNextState(String vnfType, String currentState, String event) throws NoTransitionDefinedException,LifecycleException{
+        if (logger.isTraceEnabled()) {
+            logger.trace("Entering to getNextState with vnfType = "+ vnfType +    ", currentState = " + currentState + ", event = " + event);
+        }
+
+        State nextState;
+        StateMachine machine;
+        StateMachineResponse response;
+        try {
+            machine = this.getStateMachine(vnfType);
+            response = machine.handleEvent(new State(currentState),new Event(event));
+            if(Response.NO_TRANSITION_DEFINED.equals(response.getResponse())){
+                errorLogger.error(EELFResourceManager.format(Msg.VF_ILLEGAL_COMMAND, vnfType,event,currentState));
+                throw new NoTransitionDefinedException("No Transition Defined for currentState = " +  currentState + ", event = " + event,currentState,event);
+            }
+            nextState = response.getNextState();
+        } catch (InvalidInputException e) {
+            logger.error(e.getMessage());
+            throw new LifecycleException(e,currentState,event);
+        }
+        if (logger.isTraceEnabled()) {
+            logger.trace("Exiting from getNextState with (nextState = " + nextState.getStateName() + ")");
+        }
+        return nextState.getStateName();
+    }
+
+    private StateMachine getStateMachine(String vnfType){
+        if (logger.isTraceEnabled()) {
+            logger.trace("Entering to getNextState with vnfType = "+ vnfType);
+        }
+        if(vnfType == null){
+            vnfType = "DEFAULT";
+        }
+        StateMachine machine = stateMachineMap.get(vnfType);
+        if(machine == null){
+            metadataReader = getMetadataReader(vnfType);
+            StateMachineMetadata metadata = metadataReader.readMetadata();
+            machine = StateMachineFactory.getStateMachine(metadata);
+            stateMachineMap.put(vnfType,machine);
+        }
+
+        logger.trace("Exiting getStateMachine with StateMachine = " + stateMachineMap.get(vnfType).toString());
+        return stateMachineMap.get(vnfType);
+    }
+
+    private StateMetaDataReader getMetadataReader(String vnfType) {
+        return vnfType.equals("APPC") ? new AppcOamMetaDataReader() : new VnfMetaDataReader();
+    }
+
+}
diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 77725db..cea242f 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -1,34 +1,34 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
   ============LICENSE_START=======================================================
   ONAP : APPC
   ================================================================================
   Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
   ================================================================================
-  Copyright (C) 2017 Amdocs
-  =============================================================================
-  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.
-  
+  Copyright (C) 2017 Amdocs
+  =============================================================================
+  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.
+  
   ECOMP is a trademark and service mark of AT&T Intellectual Property.
-  ============LICENSE_END=========================================================
-  -->
-
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
-    <bean id="lifecycleManagerBean" class="org.openecomp.appc.lifecyclemanager.impl.LifecycleManagerImpl" scope="singleton">
-    </bean>
-
-    <service id="lcmService" interface="org.openecomp.appc.lifecyclemanager.LifecycleManager" ref="lifecycleManagerBean"/>
-
-</blueprint>
+  ============LICENSE_END=========================================================
+  -->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
+    <bean id="lifecycleManagerBean" class="org.openecomp.appc.lifecyclemanager.impl.LifecycleManagerImpl" scope="singleton">
+    </bean>
+
+    <service id="lcmService" interface="org.openecomp.appc.lifecyclemanager.LifecycleManager" ref="lifecycleManagerBean"/>
+
+</blueprint>
diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/org/openecomp/appc/default.properties b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/org/openecomp/appc/default.properties
index 6b634ca..99d7283 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/org/openecomp/appc/default.properties
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/org/openecomp/appc/default.properties
@@ -1,39 +1,39 @@
-###
+###
 # ============LICENSE_START=======================================================
 # ONAP : APPC
 # ================================================================================
 # Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 # ================================================================================
-# Copyright (C) 2017 Amdocs
-# =============================================================================
-# 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.
-# 
+# Copyright (C) 2017 Amdocs
+# =============================================================================
+# 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.
+# 
 # ECOMP is a trademark and service mark of AT&T Intellectual Property.
-# ============LICENSE_END=========================================================
-###
-
-# Define the name and path of any user-provided configuration (bootstrap) file that can be loaded 
-# to supply configuration options 
-org.openecomp.appc.bootstrap.file=appc.properties
-org.openecomp.appc.bootstrap.path=/opt/openecomp/appc/data/properties,${user.home},.
-
-#Property below provided by appc.properties
-appc.LCM.provider.url=https://localhost:8443/restconf/operations/appc-provider-lcm
-appc.LCM.poolMembers=<DMAAP_IP>:3904
-appc.LCM.service=dmaap
-appc.LCM.topic.write=APPC-TEST2
-appc.LCM.client.name=APPC-TEST-CLIENT-LC-MGMT-MAIN
-appc.LCM.provider.user=test
-appc.LCM.provider.pass=test
-
-
+# ============LICENSE_END=========================================================
+###
+
+# Define the name and path of any user-provided configuration (bootstrap) file that can be loaded 
+# to supply configuration options 
+org.openecomp.appc.bootstrap.file=appc.properties
+org.openecomp.appc.bootstrap.path=/opt/openecomp/appc/data/properties,${user.home},.
+
+#Property below provided by appc.properties
+appc.LCM.provider.url=https://localhost:8443/restconf/operations/appc-provider-lcm
+appc.LCM.poolMembers=<DMAAP_IP>:3904
+appc.LCM.service=dmaap
+appc.LCM.topic.write=APPC-TEST2
+appc.LCM.client.name=APPC-TEST-CLIENT-LC-MGMT-MAIN
+appc.LCM.provider.user=test
+appc.LCM.provider.pass=test
+
+
diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/LifecycleManagerTest.java b/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/LifecycleManagerTest.java
index e58dcc9..299c325 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/LifecycleManagerTest.java
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/LifecycleManagerTest.java
@@ -1,185 +1,185 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.openecomp.appc.exceptions.InvalidInputException;
-import org.openecomp.appc.lifecyclemanager.LifecycleManager;
-import org.openecomp.appc.statemachine.StateMetaDataReader;
-import org.openecomp.appc.lifecyclemanager.impl.LifecycleManagerImpl;
-import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;
-import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;
-import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader;
-import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader.VNFOperation;
-import org.openecomp.appc.statemachine.objects.Event;
-import org.openecomp.appc.statemachine.objects.State;
-import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
-import org.openecomp.appc.statemachine.objects.Transition;
-
-import java.util.*;
-
-
-public class LifecycleManagerTest {
-
-    private static final State[] VALID_LOCK_STATES = new State[] {
-            new State("instantiated"),
-            new State("configured"),
-            new State("tested"),
-            new State("running"),
-            new State("error"),
-            new State("unknown"),
-            new State("created"),
-            new State("not orchestrated"),
-            new State("stopped"),
-    };
-
-    @Test
-    public void handleEvent() throws InvalidInputException, LifecycleException, NoTransitionDefinedException {
-
-        StateMachineMetadata metadata = getMetaDataReader().readMetadata();
-        LifecycleManagerImpl lifecycleManager = new LifecycleManagerImpl();
-
-        /*
-         * Testing Positive Scenario passing the valid events and validating the StateMachineResponse
-         */
-        for(State state:metadata.getStates()){
-
-            for(Transition transition:state.getTransitions()){
-                Event event = transition.getEvent();
-                State nextStateFromMetadata = transition.getNextState();
-
-                String expectedNextState = lifecycleManager.getNextState(null,state.toString(),event.toString());
-                Assert.assertEquals(expectedNextState,nextStateFromMetadata.toString());
-            }
-        }
-
-        /*
-        Testing Negative Scenarios, 1. Passing the valid Events for which Transition is not defined in
-        Metadata and validating the StateMachineResponse 2. Passing the invalid events which are not
-        registered as events in the StateMachineMetadata and validating StateMachineResponse
-         */
-        for(State state:metadata.getStates()){
-
-            for(Transition transition:state.getTransitions()){
-                List<Event> negativeEvents = getNegativeEvents(state,metadata.getEvents());
-
-                for(Event negativeEvent:negativeEvents){
-                    boolean flag =false;
-                    try{
-                        lifecycleManager.getNextState(null,state.toString(),negativeEvent.toString());
-
-                    }
-                    catch (NoTransitionDefinedException e){
-                        flag =true;
-                    }
-                    Assert.assertEquals(flag,true);
-
-                    flag = false;
-                    try{
-                        lifecycleManager.getNextState(null,state.toString(),"PUT");
-                    }
-                    catch(LifecycleException e){
-                        flag = true;
-                    }
-                    Assert.assertTrue(flag);
-
-                }
-            }
-        }
-    }
-
-    @Test
-    public void testNotOrchestratedState() throws LifecycleException, NoTransitionDefinedException {
-        LifecycleManager lifecycleManager = new LifecycleManagerImpl();
-        String nextState = lifecycleManager.getNextState(
-                null,"NOT ORCHESTRATED",VNFOperation.Configure.toString());
-        Assert.assertEquals(nextState,"Configuring");
-    }
-
-    @Test(expected = NoTransitionDefinedException.class)
-    public void testBakckingUpState() throws LifecycleException, NoTransitionDefinedException {
-        LifecycleManager lifecycleManager = new LifecycleManagerImpl();
-        lifecycleManager.getNextState(null,"Software_Uploading",VNFOperation.Configure.toString());
-    }
-
-    private List<Event> getNegativeEvents(State state,Set<Event> events) {
-        List<Event> negativeEventList = new ArrayList<>();
-        negativeEventList.addAll(events);
-
-        for(Transition transition: state.getTransitions()){
-            negativeEventList.remove(transition.getEvent());
-        }
-        return negativeEventList;
-    }
-
-    @Test
-    public void testLockStates() throws LifecycleException, NoTransitionDefinedException {
-        StateMachineMetadata metadata = getMetaDataReader().readMetadata();
-        LifecycleManagerImpl lifecycleManager = new LifecycleManagerImpl();
-
-        for(State state: metadata.getStates()) {
-            if(isValidState(state, VALID_LOCK_STATES)) {
-                assertSameNextState(lifecycleManager, state, VNFOperation.Lock);
-                assertSameNextState(lifecycleManager, state, VnfMetaDataReader.VNFOperation.Unlock);
-                assertSameNextState(lifecycleManager, state, VNFOperation.CheckLock);
-            } else {
-                assertNoNextState(lifecycleManager, state, VNFOperation.Lock);
-                assertNoNextState(lifecycleManager, state, VNFOperation.Unlock);
-                assertNoNextState(lifecycleManager, state, VNFOperation.CheckLock);
-            }
-        }
-    }
-
-    private boolean isValidState(State state, State[] validStates) {
-        for(State validState: validStates) {
-            if(validState.equals(state)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private void assertSameNextState(LifecycleManager lifecycleManager, State state, VNFOperation operation)
-            throws LifecycleException, NoTransitionDefinedException {
-        Assert.assertEquals(state.getStateName(),
-                lifecycleManager.getNextState("no-matter", state.getStateName(), operation.toString()));
-    }
-
-    private void assertNoNextState(LifecycleManager lifecycleManager, State state, VNFOperation operation)
-            throws LifecycleException {
-        try {
-            lifecycleManager.getNextState("no-matter", state.getStateName(), operation.toString());
-            Assert.fail("lifecycleManager.getNextState() should fail for state [" + state
-                    + "], operation [" + operation + "]");
-        } catch(NoTransitionDefinedException e) {
-            // this exception is excepted
-        }
-    }
-
-    private StateMetaDataReader getMetaDataReader() {
-        return new VnfMetaDataReader();
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openecomp.appc.exceptions.InvalidInputException;
+import org.openecomp.appc.lifecyclemanager.LifecycleManager;
+import org.openecomp.appc.statemachine.StateMetaDataReader;
+import org.openecomp.appc.lifecyclemanager.impl.LifecycleManagerImpl;
+import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;
+import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;
+import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader;
+import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader.VNFOperation;
+import org.openecomp.appc.statemachine.objects.Event;
+import org.openecomp.appc.statemachine.objects.State;
+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
+import org.openecomp.appc.statemachine.objects.Transition;
+
+import java.util.*;
+
+
+public class LifecycleManagerTest {
+
+    private static final State[] VALID_LOCK_STATES = new State[] {
+            new State("instantiated"),
+            new State("configured"),
+            new State("tested"),
+            new State("running"),
+            new State("error"),
+            new State("unknown"),
+            new State("created"),
+            new State("not orchestrated"),
+            new State("stopped"),
+    };
+
+    @Test
+    public void handleEvent() throws InvalidInputException, LifecycleException, NoTransitionDefinedException {
+
+        StateMachineMetadata metadata = getMetaDataReader().readMetadata();
+        LifecycleManagerImpl lifecycleManager = new LifecycleManagerImpl();
+
+        /*
+         * Testing Positive Scenario passing the valid events and validating the StateMachineResponse
+         */
+        for(State state:metadata.getStates()){
+
+            for(Transition transition:state.getTransitions()){
+                Event event = transition.getEvent();
+                State nextStateFromMetadata = transition.getNextState();
+
+                String expectedNextState = lifecycleManager.getNextState(null,state.toString(),event.toString());
+                Assert.assertEquals(expectedNextState,nextStateFromMetadata.toString());
+            }
+        }
+
+        /*
+        Testing Negative Scenarios, 1. Passing the valid Events for which Transition is not defined in
+        Metadata and validating the StateMachineResponse 2. Passing the invalid events which are not
+        registered as events in the StateMachineMetadata and validating StateMachineResponse
+         */
+        for(State state:metadata.getStates()){
+
+            for(Transition transition:state.getTransitions()){
+                List<Event> negativeEvents = getNegativeEvents(state,metadata.getEvents());
+
+                for(Event negativeEvent:negativeEvents){
+                    boolean flag =false;
+                    try{
+                        lifecycleManager.getNextState(null,state.toString(),negativeEvent.toString());
+
+                    }
+                    catch (NoTransitionDefinedException e){
+                        flag =true;
+                    }
+                    Assert.assertEquals(flag,true);
+
+                    flag = false;
+                    try{
+                        lifecycleManager.getNextState(null,state.toString(),"PUT");
+                    }
+                    catch(LifecycleException e){
+                        flag = true;
+                    }
+                    Assert.assertTrue(flag);
+
+                }
+            }
+        }
+    }
+
+    @Test
+    public void testNotOrchestratedState() throws LifecycleException, NoTransitionDefinedException {
+        LifecycleManager lifecycleManager = new LifecycleManagerImpl();
+        String nextState = lifecycleManager.getNextState(
+                null,"NOT ORCHESTRATED",VNFOperation.Configure.toString());
+        Assert.assertEquals(nextState,"Configuring");
+    }
+
+    @Test(expected = NoTransitionDefinedException.class)
+    public void testBakckingUpState() throws LifecycleException, NoTransitionDefinedException {
+        LifecycleManager lifecycleManager = new LifecycleManagerImpl();
+        lifecycleManager.getNextState(null,"Software_Uploading",VNFOperation.Configure.toString());
+    }
+
+    private List<Event> getNegativeEvents(State state,Set<Event> events) {
+        List<Event> negativeEventList = new ArrayList<>();
+        negativeEventList.addAll(events);
+
+        for(Transition transition: state.getTransitions()){
+            negativeEventList.remove(transition.getEvent());
+        }
+        return negativeEventList;
+    }
+
+    @Test
+    public void testLockStates() throws LifecycleException, NoTransitionDefinedException {
+        StateMachineMetadata metadata = getMetaDataReader().readMetadata();
+        LifecycleManagerImpl lifecycleManager = new LifecycleManagerImpl();
+
+        for(State state: metadata.getStates()) {
+            if(isValidState(state, VALID_LOCK_STATES)) {
+                assertSameNextState(lifecycleManager, state, VNFOperation.Lock);
+                assertSameNextState(lifecycleManager, state, VnfMetaDataReader.VNFOperation.Unlock);
+                assertSameNextState(lifecycleManager, state, VNFOperation.CheckLock);
+            } else {
+                assertNoNextState(lifecycleManager, state, VNFOperation.Lock);
+                assertNoNextState(lifecycleManager, state, VNFOperation.Unlock);
+                assertNoNextState(lifecycleManager, state, VNFOperation.CheckLock);
+            }
+        }
+    }
+
+    private boolean isValidState(State state, State[] validStates) {
+        for(State validState: validStates) {
+            if(validState.equals(state)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void assertSameNextState(LifecycleManager lifecycleManager, State state, VNFOperation operation)
+            throws LifecycleException, NoTransitionDefinedException {
+        Assert.assertEquals(state.getStateName(),
+                lifecycleManager.getNextState("no-matter", state.getStateName(), operation.toString()));
+    }
+
+    private void assertNoNextState(LifecycleManager lifecycleManager, State state, VNFOperation operation)
+            throws LifecycleException {
+        try {
+            lifecycleManager.getNextState("no-matter", state.getStateName(), operation.toString());
+            Assert.fail("lifecycleManager.getNextState() should fail for state [" + state
+                    + "], operation [" + operation + "]");
+        } catch(NoTransitionDefinedException e) {
+            // this exception is excepted
+        }
+    }
+
+    private StateMetaDataReader getMetaDataReader() {
+        return new VnfMetaDataReader();
+    }
+}
diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/OamLifeCycleManagerTest.java b/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/OamLifeCycleManagerTest.java
index d3fe3ea..0a89251 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/OamLifeCycleManagerTest.java
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/OamLifeCycleManagerTest.java
@@ -1,152 +1,152 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.openecomp.appc.lifecyclemanager.impl.LifecycleManagerImpl;
-import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;
-import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;
-import org.openecomp.appc.statemachine.impl.readers.AppcOamMetaDataReader;
-import org.openecomp.appc.statemachine.impl.readers.AppcOamStates;
-
-import java.util.Arrays;
-import java.util.List;
-
-
-public class OamLifeCycleManagerTest {
-    private static final String VNF_TYPE_APPC = "APPC";
-    private static final String NO_DEFINITION_FORMAT = "No Transition Defined for currentState = %s, event = %s";
-
-    private LifecycleManagerImpl lifecycleManager;
-
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
-
-    @Before
-    public void setUp() throws Exception {
-        lifecycleManager = new LifecycleManagerImpl();
-    }
-
-    private void validateProper(String state, String event, String expectedResult)
-            throws LifecycleException, NoTransitionDefinedException {
-        String nextState = lifecycleManager.getNextState(VNF_TYPE_APPC, state, event);
-        Assert.assertEquals(String.format("Should return %s", expectedResult), expectedResult, nextState);
-    }
-
-    private void validateException(String state, String event) throws LifecycleException, NoTransitionDefinedException {
-        expectedException.expect(NoTransitionDefinedException.class);
-        expectedException.expectMessage(String.format(NO_DEFINITION_FORMAT, state, event));
-        lifecycleManager.getNextState(VNF_TYPE_APPC, state, event);
-
-        // Reset to no expectation
-        expectedException = ExpectedException.none();
-    }
-
-    @Test
-    public void testOamStateTransitionForMaintenanceMode() throws Exception {
-        String event = AppcOamMetaDataReader.AppcOperation.MaintenanceMode.name();
-        String expecteResult = AppcOamStates.EnteringMaintenanceMode.toString();
-
-        for (AppcOamStates appcOamStates : AppcOamStates.values()) {
-            String state = appcOamStates.toString();
-            if (appcOamStates == AppcOamStates.Started) {
-                validateProper(state, event, expecteResult);
-            } else {
-                validateException(state, event);
-            }
-        }
-    }
-
-    @Test
-    public void testOamStateTransitionForStart() throws Exception {
-        String event = AppcOamMetaDataReader.AppcOperation.Start.name();
-        String expectResult = AppcOamStates.Starting.toString();
-
-        List<AppcOamStates> goodStates = Arrays.asList(
-                AppcOamStates.MaintenanceMode,
-                AppcOamStates.Stopped,
-                AppcOamStates.Stopping);
-
-        for (AppcOamStates appcOamStates : AppcOamStates.values()) {
-            String state = appcOamStates.toString();
-            if (goodStates.contains(appcOamStates)) {
-                validateProper(state, event, expectResult);
-            } else {
-                validateException(state, event);
-            }
-        }
-    }
-
-    @Test
-    public void testOamStateTransitionForStop() throws Exception {
-        String event = AppcOamMetaDataReader.AppcOperation.Stop.name();
-        String expectResult = AppcOamStates.Stopping.toString();
-
-        List<AppcOamStates> goodStates = Arrays.asList(
-                AppcOamStates.Error,
-                AppcOamStates.EnteringMaintenanceMode,
-                AppcOamStates.MaintenanceMode,
-                AppcOamStates.Started,
-                AppcOamStates.Starting);
-
-        for (AppcOamStates appcOamStates : AppcOamStates.values()) {
-            String state = appcOamStates.toString();
-            if (goodStates.contains(appcOamStates)) {
-                validateProper(state, event, expectResult);
-            } else {
-                validateException(state, event);
-            }
-        }
-    }
-
-
-    @Test
-    public void testOamStateTransitionForRestart() throws Exception {
-        String event = AppcOamMetaDataReader.AppcOperation.Restart.name();
-        String expectResult = AppcOamStates.Restarting.toString();
-
-        List<AppcOamStates> goodStates = Arrays.asList(
-                AppcOamStates.Error,
-                AppcOamStates.EnteringMaintenanceMode,
-                AppcOamStates.MaintenanceMode,
-                AppcOamStates.Started,
-                AppcOamStates.Starting,
-                AppcOamStates.Stopped,
-                AppcOamStates.Stopping);
-
-        for (AppcOamStates appcOamStates : AppcOamStates.values()) {
-            String state = appcOamStates.toString();
-            if (goodStates.contains(appcOamStates)) {
-                validateProper(state, event, expectResult);
-            } else {
-                validateException(state, event);
-            }
-        }
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.openecomp.appc.lifecyclemanager.impl.LifecycleManagerImpl;
+import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;
+import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;
+import org.openecomp.appc.statemachine.impl.readers.AppcOamMetaDataReader;
+import org.openecomp.appc.statemachine.impl.readers.AppcOamStates;
+
+import java.util.Arrays;
+import java.util.List;
+
+
+public class OamLifeCycleManagerTest {
+    private static final String VNF_TYPE_APPC = "APPC";
+    private static final String NO_DEFINITION_FORMAT = "No Transition Defined for currentState = %s, event = %s";
+
+    private LifecycleManagerImpl lifecycleManager;
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Before
+    public void setUp() throws Exception {
+        lifecycleManager = new LifecycleManagerImpl();
+    }
+
+    private void validateProper(String state, String event, String expectedResult)
+            throws LifecycleException, NoTransitionDefinedException {
+        String nextState = lifecycleManager.getNextState(VNF_TYPE_APPC, state, event);
+        Assert.assertEquals(String.format("Should return %s", expectedResult), expectedResult, nextState);
+    }
+
+    private void validateException(String state, String event) throws LifecycleException, NoTransitionDefinedException {
+        expectedException.expect(NoTransitionDefinedException.class);
+        expectedException.expectMessage(String.format(NO_DEFINITION_FORMAT, state, event));
+        lifecycleManager.getNextState(VNF_TYPE_APPC, state, event);
+
+        // Reset to no expectation
+        expectedException = ExpectedException.none();
+    }
+
+    @Test
+    public void testOamStateTransitionForMaintenanceMode() throws Exception {
+        String event = AppcOamMetaDataReader.AppcOperation.MaintenanceMode.name();
+        String expecteResult = AppcOamStates.EnteringMaintenanceMode.toString();
+
+        for (AppcOamStates appcOamStates : AppcOamStates.values()) {
+            String state = appcOamStates.toString();
+            if (appcOamStates == AppcOamStates.Started) {
+                validateProper(state, event, expecteResult);
+            } else {
+                validateException(state, event);
+            }
+        }
+    }
+
+    @Test
+    public void testOamStateTransitionForStart() throws Exception {
+        String event = AppcOamMetaDataReader.AppcOperation.Start.name();
+        String expectResult = AppcOamStates.Starting.toString();
+
+        List<AppcOamStates> goodStates = Arrays.asList(
+                AppcOamStates.MaintenanceMode,
+                AppcOamStates.Stopped,
+                AppcOamStates.Stopping);
+
+        for (AppcOamStates appcOamStates : AppcOamStates.values()) {
+            String state = appcOamStates.toString();
+            if (goodStates.contains(appcOamStates)) {
+                validateProper(state, event, expectResult);
+            } else {
+                validateException(state, event);
+            }
+        }
+    }
+
+    @Test
+    public void testOamStateTransitionForStop() throws Exception {
+        String event = AppcOamMetaDataReader.AppcOperation.Stop.name();
+        String expectResult = AppcOamStates.Stopping.toString();
+
+        List<AppcOamStates> goodStates = Arrays.asList(
+                AppcOamStates.Error,
+                AppcOamStates.EnteringMaintenanceMode,
+                AppcOamStates.MaintenanceMode,
+                AppcOamStates.Started,
+                AppcOamStates.Starting);
+
+        for (AppcOamStates appcOamStates : AppcOamStates.values()) {
+            String state = appcOamStates.toString();
+            if (goodStates.contains(appcOamStates)) {
+                validateProper(state, event, expectResult);
+            } else {
+                validateException(state, event);
+            }
+        }
+    }
+
+
+    @Test
+    public void testOamStateTransitionForRestart() throws Exception {
+        String event = AppcOamMetaDataReader.AppcOperation.Restart.name();
+        String expectResult = AppcOamStates.Restarting.toString();
+
+        List<AppcOamStates> goodStates = Arrays.asList(
+                AppcOamStates.Error,
+                AppcOamStates.EnteringMaintenanceMode,
+                AppcOamStates.MaintenanceMode,
+                AppcOamStates.Started,
+                AppcOamStates.Starting,
+                AppcOamStates.Stopped,
+                AppcOamStates.Stopping);
+
+        for (AppcOamStates appcOamStates : AppcOamStates.values()) {
+            String state = appcOamStates.toString();
+            if (goodStates.contains(appcOamStates)) {
+                validateProper(state, event, expectResult);
+            } else {
+                validateException(state, event);
+            }
+        }
+    }
+}
diff --git a/appc-lifecycle-management/appc-lifecycle-management-features/src/main/resources/features.xml b/appc-lifecycle-management/appc-lifecycle-management-features/src/main/resources/features.xml
index 9700f77..635ee67 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-features/src/main/resources/features.xml
+++ b/appc-lifecycle-management/appc-lifecycle-management-features/src/main/resources/features.xml
@@ -1,38 +1,38 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
   ============LICENSE_START=======================================================
   ONAP : APPC
   ================================================================================
   Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
   ================================================================================
-  Copyright (C) 2017 Amdocs
-  =============================================================================
-  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.
-  
+  Copyright (C) 2017 Amdocs
+  =============================================================================
+  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.
+  
   ECOMP is a trademark and service mark of AT&T Intellectual Property.
-  ============LICENSE_END=========================================================
-  -->
-
-
-<features name="appc-lifecycle-management-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0  http://karaf.apache.org/xmlns/features/v1.2.0">
-
-    <feature name='appc-lifecycle-management' description="application executor" version='${project.version}'>
-        <bundle dependency="true">mvn:org.openecomp.appc/appc-common/${project.version}</bundle>
-        <bundle>mvn:org.openecomp.appc/state-machine-lib/${project.version}</bundle>
-        <bundle>mvn:org.openecomp.appc/appc-lifecycle-management-api/${project.version}</bundle>
-        <bundle>mvn:org.openecomp.appc/appc-lifecycle-management-core/${project.version}</bundle>
-    </feature>
-
-</features>
+  ============LICENSE_END=========================================================
+  -->
+
+
+<features name="appc-lifecycle-management-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0  http://karaf.apache.org/xmlns/features/v1.2.0">
+
+    <feature name='appc-lifecycle-management' description="application executor" version='${project.version}'>
+        <bundle dependency="true">mvn:org.openecomp.appc/appc-common/${project.version}</bundle>
+        <bundle>mvn:org.openecomp.appc/state-machine-lib/${project.version}</bundle>
+        <bundle>mvn:org.openecomp.appc/appc-lifecycle-management-api/${project.version}</bundle>
+        <bundle>mvn:org.openecomp.appc/appc-lifecycle-management-core/${project.version}</bundle>
+    </feature>
+
+</features>
diff --git a/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_installer_zip.xml b/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_installer_zip.xml
index 4b7b6f3..df18e18 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_installer_zip.xml
+++ b/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_installer_zip.xml
@@ -1,60 +1,60 @@
-<!--
+<!--
   ============LICENSE_START=======================================================
   ONAP : APPC
   ================================================================================
   Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
   ================================================================================
-  Copyright (C) 2017 Amdocs
-  =============================================================================
-  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.
-  
+  Copyright (C) 2017 Amdocs
+  =============================================================================
+  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.
+  
   ECOMP is a trademark and service mark of AT&T Intellectual Property.
-  ============LICENSE_END=========================================================
-  -->
-
-<!-- Defines how we build the .zip file which is our distribution. -->
-
-<assembly
-        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
-    <id>controller</id>
-    <formats>
-        <format>zip</format>
-    </formats>
-
-    <!--  we want "system" and related files right at the root level
-          as this file is suppose to be unzip on top of a karaf
-          distro. -->
-    <includeBaseDirectory>false</includeBaseDirectory>
-
-    <fileSets>
-        <fileSet>
-            <directory>target/stage/</directory>
-            <outputDirectory>${application.name}</outputDirectory>
-            <fileMode>755</fileMode>
-            <includes>
-                <include>*.sh</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>target/stage/</directory>
-            <outputDirectory>${application.name}</outputDirectory>
-            <fileMode>644</fileMode>
-            <excludes>
-                <exclude>*.sh</exclude>
-            </excludes>
-        </fileSet>
-    </fileSets>
-
-</assembly>
+  ============LICENSE_END=========================================================
+  -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+    <id>controller</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+
+    <!--  we want "system" and related files right at the root level
+          as this file is suppose to be unzip on top of a karaf
+          distro. -->
+    <includeBaseDirectory>false</includeBaseDirectory>
+
+    <fileSets>
+        <fileSet>
+            <directory>target/stage/</directory>
+            <outputDirectory>${application.name}</outputDirectory>
+            <fileMode>755</fileMode>
+            <includes>
+                <include>*.sh</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>target/stage/</directory>
+            <outputDirectory>${application.name}</outputDirectory>
+            <fileMode>644</fileMode>
+            <excludes>
+                <exclude>*.sh</exclude>
+            </excludes>
+        </fileSet>
+    </fileSets>
+
+</assembly>
diff --git a/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_mvnrepo_zip.xml b/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_mvnrepo_zip.xml
index e735845..4278b4d 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_mvnrepo_zip.xml
+++ b/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_mvnrepo_zip.xml
@@ -1,51 +1,51 @@
-<!--
+<!--
   ============LICENSE_START=======================================================
   ONAP : APPC
   ================================================================================
   Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
   ================================================================================
-  Copyright (C) 2017 Amdocs
-  =============================================================================
-  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.
-  
+  Copyright (C) 2017 Amdocs
+  =============================================================================
+  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.
+  
   ECOMP is a trademark and service mark of AT&T Intellectual Property.
-  ============LICENSE_END=========================================================
-  -->
-
-<!-- Defines how we build the .zip file which is our distribution. -->
-
-<assembly
-        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0
-         http://maven.apache.org/xsd/assembly-1.1.0.xsd">
-    <id>controller</id>
-    <formats>
-        <format>zip</format>
-    </formats>
-
-    <!--  we want "system" and related files right at the root level
-          as this file is suppose to be unzip on top of a karaf
-          distro. -->
-    <includeBaseDirectory>false</includeBaseDirectory>
-
-    <fileSets>
-        <fileSet>
-            <directory>target/assembly/</directory>
-            <outputDirectory>.</outputDirectory>
-            <excludes>
-            </excludes>
-        </fileSet>
-    </fileSets>
-
-</assembly>
+  ============LICENSE_END=========================================================
+  -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0
+         http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+    <id>controller</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+
+    <!--  we want "system" and related files right at the root level
+          as this file is suppose to be unzip on top of a karaf
+          distro. -->
+    <includeBaseDirectory>false</includeBaseDirectory>
+
+    <fileSets>
+        <fileSet>
+            <directory>target/assembly/</directory>
+            <outputDirectory>.</outputDirectory>
+            <excludes>
+            </excludes>
+        </fileSet>
+    </fileSets>
+
+</assembly>
diff --git a/appc-lifecycle-management/appc-lifecycle-management-installer/src/main/resources/scripts/install-feature.sh b/appc-lifecycle-management/appc-lifecycle-management-installer/src/main/resources/scripts/install-feature.sh
index 4a7e7a1..d3596c6 100644
--- a/appc-lifecycle-management/appc-lifecycle-management-installer/src/main/resources/scripts/install-feature.sh
+++ b/appc-lifecycle-management/appc-lifecycle-management-installer/src/main/resources/scripts/install-feature.sh
@@ -1,63 +1,63 @@
-###
+###
 # ============LICENSE_START=======================================================
 # ONAP : APPC
 # ================================================================================
 # Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 # ================================================================================
-# Copyright (C) 2017 Amdocs
-# =============================================================================
-# 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.
-# 
+# Copyright (C) 2017 Amdocs
+# =============================================================================
+# 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.
+# 
 # ECOMP is a trademark and service mark of AT&T Intellectual Property.
-# ============LICENSE_END=========================================================
-###
-
-#!/bin/bash
-
-ODL_HOME=${ODL_HOME:-/opt/opendaylight/current}
-ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client}
-ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-"-u karaf"}
-INSTALLERDIR=$(dirname $0)
-
-REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip
-
-if [ -f ${REPOZIP} ]
-then
-    unzip -n -d ${ODL_HOME} ${REPOZIP}
-else
-    echo "ERROR : repo zip ($REPOZIP) not found"
-    exit 1
-fi
-
-COUNT=0
-while [ $COUNT -lt 10 ]; do
-    ${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories} 2> /tmp/installErr
-    cat /tmp/installErr
-    if grep -q 'Failed to get the session' /tmp/installErr; then
-        sleep 10
-    else
-        let COUNT=10
-    fi
-    let COUNT=COUNT+1
-done
-COUNT=0
-while [ $COUNT -lt 10 ]; do
-    ${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot} 2> /tmp/installErr
-        cat /tmp/installErr
-    if grep -q 'Failed to get the session' /tmp/installErr; then
-        sleep 10
-    else
-        let COUNT=10
-    fi
-    let COUNT=COUNT+1
-done
+# ============LICENSE_END=========================================================
+###
+
+#!/bin/bash
+
+ODL_HOME=${ODL_HOME:-/opt/opendaylight/current}
+ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client}
+ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-"-u karaf"}
+INSTALLERDIR=$(dirname $0)
+
+REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip
+
+if [ -f ${REPOZIP} ]
+then
+    unzip -n -d ${ODL_HOME} ${REPOZIP}
+else
+    echo "ERROR : repo zip ($REPOZIP) not found"
+    exit 1
+fi
+
+COUNT=0
+while [ $COUNT -lt 10 ]; do
+    ${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories} 2> /tmp/installErr
+    cat /tmp/installErr
+    if grep -q 'Failed to get the session' /tmp/installErr; then
+        sleep 10
+    else
+        let COUNT=10
+    fi
+    let COUNT=COUNT+1
+done
+COUNT=0
+while [ $COUNT -lt 10 ]; do
+    ${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot} 2> /tmp/installErr
+        cat /tmp/installErr
+    if grep -q 'Failed to get the session' /tmp/installErr; then
+        sleep 10
+    else
+        let COUNT=10
+    fi
+    let COUNT=COUNT+1
+done
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMachine.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMachine.java
index 1c74861..bf08680 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMachine.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMachine.java
@@ -1,34 +1,34 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine;
-
-import org.openecomp.appc.exceptions.InvalidInputException;
-import org.openecomp.appc.statemachine.objects.Event;
-import org.openecomp.appc.statemachine.objects.State;
-import org.openecomp.appc.statemachine.objects.StateMachineResponse;
-
-public interface StateMachine {
-    StateMachineResponse handleEvent(State currentState, Event event) throws InvalidInputException;
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine;
+
+import org.openecomp.appc.exceptions.InvalidInputException;
+import org.openecomp.appc.statemachine.objects.Event;
+import org.openecomp.appc.statemachine.objects.State;
+import org.openecomp.appc.statemachine.objects.StateMachineResponse;
+
+public interface StateMachine {
+    StateMachineResponse handleEvent(State currentState, Event event) throws InvalidInputException;
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMetaDataReader.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMetaDataReader.java
index 0ddbd2f..6e60ee4 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMetaDataReader.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMetaDataReader.java
@@ -1,31 +1,31 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine;
-
-import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
-
-public interface StateMetaDataReader {
-    StateMachineMetadata readMetadata();
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine;
+
+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
+
+public interface StateMetaDataReader {
+    StateMachineMetadata readMetadata();
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineFactory.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineFactory.java
index 6c7951f..c4b49b7 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineFactory.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineFactory.java
@@ -1,40 +1,40 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.impl;
-
-import org.openecomp.appc.statemachine.StateMachine;
-import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
-
-
-public class StateMachineFactory {
-
-    private StateMachineFactory(){
-
-    }
-
-    public static StateMachine getStateMachine(StateMachineMetadata metadata){
-        return new StateMachineImpl(metadata);
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.impl;
+
+import org.openecomp.appc.statemachine.StateMachine;
+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
+
+
+public class StateMachineFactory {
+
+    private StateMachineFactory(){
+
+    }
+
+    public static StateMachine getStateMachine(StateMachineMetadata metadata){
+        return new StateMachineImpl(metadata);
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineImpl.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineImpl.java
index 124cf36..9fc1233 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineImpl.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineImpl.java
@@ -1,98 +1,98 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP : APPC
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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.
- * 
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.impl;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.openecomp.appc.exceptions.InvalidInputException;
-import org.openecomp.appc.statemachine.StateMachine;
-import org.openecomp.appc.statemachine.objects.Event;
-import org.openecomp.appc.statemachine.objects.Response;
-import org.openecomp.appc.statemachine.objects.State;
-import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
-import org.openecomp.appc.statemachine.objects.StateMachineResponse;
-import org.openecomp.appc.statemachine.objects.Transition;
-
-
-public class StateMachineImpl implements StateMachine {
-
-    private final Set<State> states;
-
-    private final Set<Event> events;
-
-    StateMachineImpl(StateMachineMetadata metadata){
-        this.states = new HashSet<>();
-        this.states.addAll(metadata.getStates());
-        this.events = new HashSet<>();
-        this.events.addAll(metadata.getEvents());
-    }
-
-    public StateMachineResponse handleEvent(State inputState, Event event) throws InvalidInputException{
-
-        if(!validateInputs(inputState,event)){
-            throw new InvalidInputException("VNF State or incoming event is invalid. State = " +inputState + " event = " + event );
-        }
-
-        StateMachineResponse response = new StateMachineResponse();
-        State currentState = null,nextState = null;
-        for(State stateInSet:states){
-            if(stateInSet.equals(inputState)){
-                currentState = stateInSet;
-                break;
-            }
-        }
-        if (currentState != null) {
-            for (Transition transition : currentState.getTransitions()) {
-                if (event.equals(transition.getEvent())) {
-                    nextState = transition.getNextState();
-                }
-            }
-        }
-        if(nextState == null){
-            response.setResponse(Response.NO_TRANSITION_DEFINED);
-        }
-        else if(inputState.equals(nextState)){
-            response.setResponse(Response.NO_STATE_CHANGE);
-        }
-        else{
-            response.setResponse(Response.VALID_TRANSITION);
-        }
-        response.setNextState(nextState);
-        return response;
-    }
-
-    private boolean validateInputs(State state,Event event) {
-        return state != null && event != null && this.states.contains(state) && this.events.contains(event);
-    }
-
-    @Override
-    public String toString() {
-        return "StateMachineImpl{" +
-                "states=" + states +
-                ", events=" + events +
-                '}';
-    }
-}
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.
+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.impl;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.openecomp.appc.exceptions.InvalidInputException;
+import org.openecomp.appc.statemachine.StateMachine;
+import org.openecomp.appc.statemachine.objects.Event;
+import org.openecomp.appc.statemachine.objects.Response;
+import org.openecomp.appc.statemachine.objects.State;
+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
+import org.openecomp.appc.statemachine.objects.StateMachineResponse;
+import org.openecomp.appc.statemachine.objects.Transition;
+
+
+public class StateMachineImpl implements StateMachine {
+
+    private final Set<State> states;
+
+    private final Set<Event> events;
+
+    StateMachineImpl(StateMachineMetadata metadata){
+        this.states = new HashSet<>();
+        this.states.addAll(metadata.getStates());
+        this.events = new HashSet<>();
+        this.events.addAll(metadata.getEvents());
+    }
+
+    public StateMachineResponse handleEvent(State inputState, Event event) throws InvalidInputException{
+
+        if(!validateInputs(inputState,event)){
+            throw new InvalidInputException("VNF State or incoming event is invalid. State = " +inputState + " event = " + event );
+        }
+
+        StateMachineResponse response = new StateMachineResponse();
+        State currentState = null,nextState = null;
+        for(State stateInSet:states){
+            if(stateInSet.equals(inputState)){
+                currentState = stateInSet;
+                break;
+            }
+        }
+        if (currentState != null) {
+            for (Transition transition : currentState.getTransitions()) {
+                if (event.equals(transition.getEvent())) {
+                    nextState = transition.getNextState();
+                }
+            }
+        }
+        if(nextState == null){
+            response.setResponse(Response.NO_TRANSITION_DEFINED);
+        }
+        else if(inputState.equals(nextState)){
+            response.setResponse(Response.NO_STATE_CHANGE);
+        }
+        else{
+            response.setResponse(Response.VALID_TRANSITION);
+        }
+        response.setNextState(nextState);
+        return response;
+    }
+
+    private boolean validateInputs(State state,Event event) {
+        return state != null && event != null && this.states.contains(state) && this.events.contains(event);
+    }
+
+    @Override
+    public String toString() {
+        return "StateMachineImpl{" +
+                "states=" + states +
+                ", events=" + events +
+                '}';
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamMetaDataReader.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamMetaDataReader.java
index e160e7f..3c1f094 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamMetaDataReader.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamMetaDataReader.java
@@ -1,107 +1,107 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.impl.readers;
-
-import org.openecomp.appc.statemachine.StateMetaDataReader;
-import org.openecomp.appc.statemachine.objects.Event;
-import org.openecomp.appc.statemachine.objects.State;
-import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
-
-public class AppcOamMetaDataReader implements StateMetaDataReader {
-
-    public enum AppcOperation {
-        MaintenanceMode,
-        Restart,
-        Start,
-        Stop
-    }
-
-    @Override
-    public StateMachineMetadata readMetadata() {
-        State NOT_INSTANTIATED = new State(AppcOamStates.NotInstantiated.toString());
-        State INSTANTIATED = new State(AppcOamStates.Instantiated.toString());
-        State RESTARTING = new State(AppcOamStates.Restarting.toString());
-        State STARTING = new State(AppcOamStates.Starting.toString());
-        State STARTED = new State(AppcOamStates.Started.toString());
-        State ENTERING_MAINTENANCE_MODE = new State(AppcOamStates.EnteringMaintenanceMode.toString());
-        State MAINTENANCE_MODE = new State(AppcOamStates.MaintenanceMode.toString());
-        State ERROR = new State(AppcOamStates.Error.toString());
-        State UNKNOWN = new State(AppcOamStates.Unknown.toString());
-        State STOPPING = new State(AppcOamStates.Stopping.toString());
-        State STOPPED = new State(AppcOamStates.Stopped.toString());
-
-        Event START = new Event(AppcOperation.Start.toString());
-        Event STOP = new Event(AppcOperation.Stop.toString());
-        Event MAINTENANCE_MODE_EVENT = new Event(AppcOperation.MaintenanceMode.toString());
-        Event RESTART = new Event(AppcOperation.Restart.toString());
-
-        StateMachineMetadata.StateMachineMetadataBuilder builder = new StateMachineMetadata
-                .StateMachineMetadataBuilder();
-
-        builder = builder.addState(NOT_INSTANTIATED);
-        builder = builder.addState(INSTANTIATED);
-        builder = builder.addState(STARTING);
-        builder = builder.addState(STARTED);
-        builder = builder.addState(ERROR);
-        builder = builder.addState(UNKNOWN);
-        builder = builder.addState(STOPPING);
-        builder = builder.addState(STOPPED);
-        builder = builder.addState(ENTERING_MAINTENANCE_MODE);
-        builder = builder.addState(MAINTENANCE_MODE);
-        builder = builder.addState(RESTARTING);
-
-        builder = builder.addEvent(START);
-        builder = builder.addEvent(STOP);
-        builder = builder.addEvent(RESTART);
-        builder = builder.addEvent(MAINTENANCE_MODE_EVENT);
-
-        /*
-         *  for addTransition:
-         *  param 1: current state; param 2: received command/request; param 3: new transition state
-         */
-        // start
-        builder = builder.addTransition(STOPPED,                   START, STARTING);
-        builder = builder.addTransition(MAINTENANCE_MODE,          START, STARTING);
-        builder = builder.addTransition(ERROR,                     START, STARTING);
-        // stop
-        builder = builder.addTransition(STARTED,                   STOP, STOPPING);
-        builder = builder.addTransition(STARTING,                  STOP, STOPPING);
-        builder = builder.addTransition(ENTERING_MAINTENANCE_MODE, STOP, STOPPING);
-        builder = builder.addTransition(MAINTENANCE_MODE,          STOP, STOPPING);
-        builder = builder.addTransition(ERROR,                     STOP, STOPPING);
-        // maintenance mode
-        builder = builder.addTransition(
-                STARTED, MAINTENANCE_MODE_EVENT, ENTERING_MAINTENANCE_MODE);
-        // restart
-        builder = builder.addTransition(STOPPED,                   RESTART, RESTARTING);
-        builder = builder.addTransition(STARTING,                  RESTART, RESTARTING);
-        builder = builder.addTransition(STARTED,                   RESTART, RESTARTING);
-        builder = builder.addTransition(ENTERING_MAINTENANCE_MODE, RESTART, RESTARTING);
-        builder = builder.addTransition(MAINTENANCE_MODE,          RESTART, RESTARTING);
-        builder = builder.addTransition(ERROR,                     RESTART, RESTARTING);
-
-        return builder.build();
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.impl.readers;
+
+import org.openecomp.appc.statemachine.StateMetaDataReader;
+import org.openecomp.appc.statemachine.objects.Event;
+import org.openecomp.appc.statemachine.objects.State;
+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
+
+public class AppcOamMetaDataReader implements StateMetaDataReader {
+
+    public enum AppcOperation {
+        MaintenanceMode,
+        Restart,
+        Start,
+        Stop
+    }
+
+    @Override
+    public StateMachineMetadata readMetadata() {
+        State NOT_INSTANTIATED = new State(AppcOamStates.NotInstantiated.toString());
+        State INSTANTIATED = new State(AppcOamStates.Instantiated.toString());
+        State RESTARTING = new State(AppcOamStates.Restarting.toString());
+        State STARTING = new State(AppcOamStates.Starting.toString());
+        State STARTED = new State(AppcOamStates.Started.toString());
+        State ENTERING_MAINTENANCE_MODE = new State(AppcOamStates.EnteringMaintenanceMode.toString());
+        State MAINTENANCE_MODE = new State(AppcOamStates.MaintenanceMode.toString());
+        State ERROR = new State(AppcOamStates.Error.toString());
+        State UNKNOWN = new State(AppcOamStates.Unknown.toString());
+        State STOPPING = new State(AppcOamStates.Stopping.toString());
+        State STOPPED = new State(AppcOamStates.Stopped.toString());
+
+        Event START = new Event(AppcOperation.Start.toString());
+        Event STOP = new Event(AppcOperation.Stop.toString());
+        Event MAINTENANCE_MODE_EVENT = new Event(AppcOperation.MaintenanceMode.toString());
+        Event RESTART = new Event(AppcOperation.Restart.toString());
+
+        StateMachineMetadata.StateMachineMetadataBuilder builder = new StateMachineMetadata
+                .StateMachineMetadataBuilder();
+
+        builder = builder.addState(NOT_INSTANTIATED);
+        builder = builder.addState(INSTANTIATED);
+        builder = builder.addState(STARTING);
+        builder = builder.addState(STARTED);
+        builder = builder.addState(ERROR);
+        builder = builder.addState(UNKNOWN);
+        builder = builder.addState(STOPPING);
+        builder = builder.addState(STOPPED);
+        builder = builder.addState(ENTERING_MAINTENANCE_MODE);
+        builder = builder.addState(MAINTENANCE_MODE);
+        builder = builder.addState(RESTARTING);
+
+        builder = builder.addEvent(START);
+        builder = builder.addEvent(STOP);
+        builder = builder.addEvent(RESTART);
+        builder = builder.addEvent(MAINTENANCE_MODE_EVENT);
+
+        /*
+         *  for addTransition:
+         *  param 1: current state; param 2: received command/request; param 3: new transition state
+         */
+        // start
+        builder = builder.addTransition(STOPPED,                   START, STARTING);
+        builder = builder.addTransition(MAINTENANCE_MODE,          START, STARTING);
+        builder = builder.addTransition(ERROR,                     START, STARTING);
+        // stop
+        builder = builder.addTransition(STARTED,                   STOP, STOPPING);
+        builder = builder.addTransition(STARTING,                  STOP, STOPPING);
+        builder = builder.addTransition(ENTERING_MAINTENANCE_MODE, STOP, STOPPING);
+        builder = builder.addTransition(MAINTENANCE_MODE,          STOP, STOPPING);
+        builder = builder.addTransition(ERROR,                     STOP, STOPPING);
+        // maintenance mode
+        builder = builder.addTransition(
+                STARTED, MAINTENANCE_MODE_EVENT, ENTERING_MAINTENANCE_MODE);
+        // restart
+        builder = builder.addTransition(STOPPED,                   RESTART, RESTARTING);
+        builder = builder.addTransition(STARTING,                  RESTART, RESTARTING);
+        builder = builder.addTransition(STARTED,                   RESTART, RESTARTING);
+        builder = builder.addTransition(ENTERING_MAINTENANCE_MODE, RESTART, RESTARTING);
+        builder = builder.addTransition(MAINTENANCE_MODE,          RESTART, RESTARTING);
+        builder = builder.addTransition(ERROR,                     RESTART, RESTARTING);
+
+        return builder.build();
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStates.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStates.java
index 2f000d9..a63f356 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStates.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStates.java
@@ -1,56 +1,56 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.impl.readers;
-
-import org.osgi.framework.Bundle;
-
-public enum AppcOamStates {
-    EnteringMaintenanceMode(0),
-    Error(0),
-    Instantiated(Bundle.INSTALLED),
-    MaintenanceMode(0),
-    NotInstantiated(Bundle.UNINSTALLED),
-    Restarting(0),
-    Started(Bundle.ACTIVE),
-    Starting(Bundle.STARTING),
-    Stopped(Bundle.RESOLVED),
-    Stopping(Bundle.STOPPING),
-    Unknown(0);
-
-    int osgiBundleState;
-
-    AppcOamStates(Integer bundleState) {
-        osgiBundleState = bundleState;
-    }
-
-    public static AppcOamStates getOamStateFromBundleState(int bundleState) {
-        for (AppcOamStates aState : values()) {
-            if (aState.osgiBundleState == bundleState) {
-                return aState;
-            }
-        }
-        return Unknown;
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.impl.readers;
+
+import org.osgi.framework.Bundle;
+
+public enum AppcOamStates {
+    EnteringMaintenanceMode(0),
+    Error(0),
+    Instantiated(Bundle.INSTALLED),
+    MaintenanceMode(0),
+    NotInstantiated(Bundle.UNINSTALLED),
+    Restarting(0),
+    Started(Bundle.ACTIVE),
+    Starting(Bundle.STARTING),
+    Stopped(Bundle.RESOLVED),
+    Stopping(Bundle.STOPPING),
+    Unknown(0);
+
+    int osgiBundleState;
+
+    AppcOamStates(Integer bundleState) {
+        osgiBundleState = bundleState;
+    }
+
+    public static AppcOamStates getOamStateFromBundleState(int bundleState) {
+        for (AppcOamStates aState : values()) {
+            if (aState.osgiBundleState == bundleState) {
+                return aState;
+            }
+        }
+        return Unknown;
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/VnfMetaDataReader.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/VnfMetaDataReader.java
index e3e72f6..8f2a69f 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/VnfMetaDataReader.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/VnfMetaDataReader.java
@@ -1,483 +1,483 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.impl.readers;
-
-import org.openecomp.appc.statemachine.StateMetaDataReader;
-import org.openecomp.appc.lifecyclemanager.objects.VNFOperationOutcome;
-import org.openecomp.appc.statemachine.objects.Event;
-import org.openecomp.appc.statemachine.objects.State;
-import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
-
-public class VnfMetaDataReader implements StateMetaDataReader {
-
-    public enum VNFOperation {
-
-        Configure, Test, HealthCheck, Start, Terminate, Restart, Rebuild, Stop, ConfigModify,
-        ConfigScaleOut,ConfigRestore,Backup, Snapshot,
-        SoftwareUpload, LiveUpgrade, Rollback, Sync, Audit, Test_lic, Migrate, Evacuate,
-        ConfigBackup, ConfigBackupDelete, ConfigExport,
-        Lock(true), Unlock(true), CheckLock(true), StartApplication,StopApplication;
-
-        private boolean builtIn;
-
-        VNFOperation(boolean builtIn) {
-            this.builtIn = builtIn;
-        }
-
-        VNFOperation() {
-            this(false);
-        }
-    }
-
-    private enum VNFStates {
-        Not_Instantiated, Instantiated, Configuring, Configured, Testing, Tested, Rebuilding, Restarting, Starting,
-        Error, Running, Unknown, Terminating, Stopping, Stopped,
-        Backing_Up, Snapshotting, Software_Uploading, Upgrading, Rollbacking, Licensing, Migrating, Evacuating,
-        NOT_ORCHESTRATED("NOT ORCHESTRATED"), Created;
-
-        String stateName;
-
-        VNFStates(String name) {
-            this.stateName = name;
-        }
-
-        VNFStates() {
-            this.stateName = name();
-        }
-
-        @Override
-        public String toString() {
-            return this.stateName;
-        }
-    }
-
-    public StateMachineMetadata readMetadata() {
-        {
-            State NOT_INSTANTIATED = new State(VNFStates.Not_Instantiated.toString());
-            State INSTANTIATED = new State(VNFStates.Instantiated.toString());
-            State CONFIGURING = new State(VNFStates.Configuring.toString());
-            State CONFIGURED = new State(VNFStates.Configured.toString());
-            State TESTING = new State(VNFStates.Testing.toString());
-            State TESTED = new State(VNFStates.Tested.toString());
-            State REBUILDING = new State(VNFStates.Rebuilding.toString());
-            State RESTARTING = new State(VNFStates.Restarting.toString());
-            State STARTING = new State(VNFStates.Starting.toString());
-            State ERROR = new State(VNFStates.Error.toString());
-            State RUNNING = new State(VNFStates.Running.toString());
-            State UNKNOWN = new State(VNFStates.Unknown.toString());
-            State TERMINATING = new State(VNFStates.Terminating.toString());
-            State STOPPING = new State(VNFStates.Stopping.toString());
-            State STOPPED = new State(VNFStates.Stopped.toString());
-            State NOT_ORCHESTRATED = new State(VNFStates.NOT_ORCHESTRATED.toString());
-
-            State BACKING_UP = new State(VNFStates.Backing_Up.toString());
-            State SNAPSHOTTING = new State(VNFStates.Snapshotting.toString());
-            State SOFTWARE_UPLOADING = new State(VNFStates.Software_Uploading.toString());
-            State UPGRADING = new State(VNFStates.Upgrading.toString());
-            State ROLLBACKING = new State(VNFStates.Rollbacking.toString());
-
-            State MIGRATING = new State(VNFStates.Migrating.toString());
-            State EVACUATING = new State(VNFStates.Evacuating.toString());
-            State CREATED= new State(VNFStates.Created.toString());
-
-            Event START_APPLICATION = new Event(VNFOperation.StartApplication.toString());
-            Event CONFIGURE = new Event(VNFOperation.Configure.toString());
-            Event HEALTHCHECK = new Event(VNFOperation.HealthCheck.toString());
-            Event TEST = new Event(VNFOperation.Test.toString());
-            Event START = new Event(VNFOperation.Start.toString());
-            Event TERMINATE = new Event(VNFOperation.Terminate.toString());
-            Event RESTART = new Event(VNFOperation.Restart.toString());
-            Event REBUILD = new Event(VNFOperation.Rebuild.toString());
-            Event STOP = new Event(VNFOperation.Stop.toString());
-            Event CONFIG_MODIFY = new Event(VNFOperation.ConfigModify.toString());
-            Event CONFIG_SCALEOUT = new Event(VNFOperation.ConfigScaleOut.toString());
-            Event CONFIG_RESTORE = new Event(VNFOperation.ConfigRestore.toString());
-            Event BACKUP = new Event(VNFOperation.Backup.toString());
-            Event SNAPSHOT = new Event(VNFOperation.Snapshot.toString());
-            Event SOFTWARE_UPLOAD = new Event(VNFOperation.SoftwareUpload.toString());
-            Event LIVE_UPGRADE = new Event(VNFOperation.LiveUpgrade.toString());
-            Event ROLLBACK = new Event(VNFOperation.Rollback.toString());
-            Event SYNC = new Event(VNFOperation.Sync.toString());
-            Event AUDIT = new Event(VNFOperation.Audit.toString());
-            Event MIGRATE = new Event(VNFOperation.Migrate.toString());
-            Event EVACUATE = new Event(VNFOperation.Evacuate.toString());
-            Event CONFIG_BACKUP = new Event(VNFOperation.ConfigBackup.toString());
-            Event CONFIG_BACKUP_DELETE = new Event(VNFOperation.ConfigBackupDelete.toString());
-            Event CONFIG_EXPORT = new Event(VNFOperation.ConfigExport.toString());
-            Event STOP_APPLICATION= new Event(VNFOperation.StopApplication.toString());
-
-            Event LOCK = new Event(VNFOperation.Lock.toString());
-            Event UNLOCK = new Event(VNFOperation.Unlock.toString());
-            Event CHECKLOCK = new Event(VNFOperation.CheckLock.toString());
-
-            Event SUCCESS = new Event(VNFOperationOutcome.SUCCESS.toString());
-            Event FAILURE = new Event(VNFOperationOutcome.FAILURE.toString());
-
-
-            StateMachineMetadata.StateMachineMetadataBuilder builder = new StateMachineMetadata.StateMachineMetadataBuilder();
-
-            builder = builder.addState(NOT_INSTANTIATED);
-            builder = builder.addState(INSTANTIATED);
-            builder = builder.addState(CONFIGURING);
-            builder = builder.addState(CONFIGURED);
-            builder = builder.addState(TESTING);
-            builder = builder.addState(TESTED);
-            builder = builder.addState(REBUILDING);
-            builder = builder.addState(RESTARTING);
-            builder = builder.addState(STARTING);
-            builder = builder.addState(ERROR);
-            builder = builder.addState(RUNNING);
-            builder = builder.addState(UNKNOWN);
-            builder = builder.addState(TERMINATING);
-            builder = builder.addState(STOPPING);
-            builder = builder.addState(STOPPED);
-
-            builder = builder.addState(BACKING_UP);
-            builder = builder.addState(SNAPSHOTTING);
-            builder = builder.addState(SOFTWARE_UPLOADING);
-            builder = builder.addState(UPGRADING);
-            builder = builder.addState(ROLLBACKING);
-            builder = builder.addState(MIGRATING);
-            builder = builder.addState(EVACUATING);
-            builder = builder.addState(NOT_ORCHESTRATED);
-            builder = builder.addState(CREATED);
-            builder = builder.addEvent(START_APPLICATION);
-            builder = builder.addEvent(CONFIGURE);
-            builder = builder.addEvent(TEST);
-            builder = builder.addEvent(START);
-            builder = builder.addEvent(TERMINATE);
-            builder = builder.addEvent(RESTART);
-            builder = builder.addEvent(REBUILD);
-            builder = builder.addEvent(SUCCESS);
-            builder = builder.addEvent(FAILURE);
-            builder = builder.addEvent(STOP);
-            builder = builder.addEvent(CONFIG_MODIFY);
-            builder = builder.addEvent(CONFIG_SCALEOUT);
-            builder = builder.addEvent(CONFIG_RESTORE);
-            builder = builder.addEvent(HEALTHCHECK);
-            builder = builder.addEvent(BACKUP);
-            builder = builder.addEvent(SNAPSHOT);
-            builder = builder.addEvent(SOFTWARE_UPLOAD);
-            builder = builder.addEvent(LIVE_UPGRADE);
-            builder = builder.addEvent(ROLLBACK);
-            builder = builder.addEvent(SYNC);
-            builder = builder.addEvent(AUDIT);
-            builder = builder.addEvent(MIGRATE);
-            builder = builder.addEvent(EVACUATE);
-            builder = builder.addEvent(LOCK);
-            builder = builder.addEvent(UNLOCK);
-            builder = builder.addEvent(CHECKLOCK);
-            builder = builder.addEvent(CONFIG_BACKUP);
-            builder = builder.addEvent(CONFIG_BACKUP_DELETE);
-            builder = builder.addEvent(CONFIG_EXPORT);
-            builder = builder.addEvent(STOP_APPLICATION);
-
-            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIGURE,CONFIGURING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,TEST,TESTING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,START,STARTING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,TERMINATE,TERMINATING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,RESTART,RESTARTING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,REBUILD,REBUILDING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,STOP,STOPPING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_MODIFY,CONFIGURING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_SCALEOUT,CONFIGURING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_RESTORE,CONFIGURING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,HEALTHCHECK,TESTING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,BACKUP,BACKING_UP);
-            builder = builder.addTransition(NOT_ORCHESTRATED,SNAPSHOT,SNAPSHOTTING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,LIVE_UPGRADE,UPGRADING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,ROLLBACK,ROLLBACKING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,MIGRATE,MIGRATING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,EVACUATE,EVACUATING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,LOCK,NOT_ORCHESTRATED);
-            builder = builder.addTransition(NOT_ORCHESTRATED,UNLOCK,NOT_ORCHESTRATED);
-            builder = builder.addTransition(NOT_ORCHESTRATED,CHECKLOCK,NOT_ORCHESTRATED);
-            builder = builder.addTransition(NOT_ORCHESTRATED,START_APPLICATION,STARTING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,STOP_APPLICATION,STOPPING);
-            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_BACKUP,NOT_ORCHESTRATED);
-
-            builder = builder.addTransition(CREATED,CONFIGURE,CONFIGURING);
-            builder = builder.addTransition(CREATED,TEST,TESTING);
-            builder = builder.addTransition(CREATED,START,STARTING);
-            builder = builder.addTransition(CREATED,TERMINATE,TERMINATING);
-            builder = builder.addTransition(CREATED,RESTART,RESTARTING);
-            builder = builder.addTransition(CREATED,REBUILD,REBUILDING);
-            builder = builder.addTransition(CREATED,STOP,STOPPING);
-            builder = builder.addTransition(CREATED,CONFIG_MODIFY,CONFIGURING);
-            builder = builder.addTransition(CREATED,CONFIG_SCALEOUT,CONFIGURING);
-            builder = builder.addTransition(CREATED,CONFIG_RESTORE,CONFIGURING);
-            builder = builder.addTransition(CREATED,HEALTHCHECK,TESTING);
-            builder = builder.addTransition(CREATED,BACKUP,BACKING_UP);
-            builder = builder.addTransition(CREATED,SNAPSHOT,SNAPSHOTTING);
-            builder = builder.addTransition(CREATED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
-            builder = builder.addTransition(CREATED,LIVE_UPGRADE,UPGRADING);
-            builder = builder.addTransition(CREATED,ROLLBACK,ROLLBACKING);
-            builder = builder.addTransition(CREATED,MIGRATE,MIGRATING);
-            builder = builder.addTransition(CREATED,EVACUATE,EVACUATING);
-            builder = builder.addTransition(CREATED,LOCK,CREATED);
-            builder = builder.addTransition(CREATED,UNLOCK,CREATED);
-            builder = builder.addTransition(CREATED,CHECKLOCK,CREATED);
-            builder = builder.addTransition(CREATED,START_APPLICATION,STARTING);
-            builder = builder.addTransition(CREATED,STOP_APPLICATION,STOPPING);
-            builder = builder.addTransition(CREATED,CONFIG_BACKUP,CREATED);
-
-            builder = builder.addTransition(INSTANTIATED,CONFIGURE,CONFIGURING);
-            builder = builder.addTransition(INSTANTIATED,TEST,TESTING);
-            builder = builder.addTransition(INSTANTIATED,START,STARTING);
-            builder = builder.addTransition(INSTANTIATED,TERMINATE,TERMINATING);
-            builder = builder.addTransition(INSTANTIATED,RESTART,RESTARTING);
-            builder = builder.addTransition(INSTANTIATED,REBUILD,REBUILDING);
-            builder = builder.addTransition(INSTANTIATED,STOP,STOPPING);
-            builder = builder.addTransition(INSTANTIATED,CONFIG_MODIFY,CONFIGURING);
-            builder = builder.addTransition(INSTANTIATED,CONFIG_SCALEOUT,CONFIGURING);
-            builder = builder.addTransition(INSTANTIATED,CONFIG_RESTORE,CONFIGURING);
-            builder = builder.addTransition(INSTANTIATED,HEALTHCHECK,TESTING);
-            builder = builder.addTransition(INSTANTIATED,BACKUP,BACKING_UP);
-            builder = builder.addTransition(INSTANTIATED,SNAPSHOT,SNAPSHOTTING);
-            builder = builder.addTransition(INSTANTIATED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
-            builder = builder.addTransition(INSTANTIATED,LIVE_UPGRADE,UPGRADING);
-            builder = builder.addTransition(INSTANTIATED,ROLLBACK,ROLLBACKING);
-            builder = builder.addTransition(INSTANTIATED,MIGRATE,MIGRATING);
-            builder = builder.addTransition(INSTANTIATED,EVACUATE,EVACUATING);
-            builder = builder.addTransition(INSTANTIATED,LOCK,INSTANTIATED);
-            builder = builder.addTransition(INSTANTIATED,UNLOCK,INSTANTIATED);
-            builder = builder.addTransition(INSTANTIATED,CHECKLOCK,INSTANTIATED);
-
-            builder = builder.addTransition(CONFIGURED,CONFIGURE,CONFIGURING);
-            builder = builder.addTransition(CONFIGURED,TEST,TESTING);
-            builder = builder.addTransition(CONFIGURED,START,STARTING);
-            builder = builder.addTransition(CONFIGURED,TERMINATE,TERMINATING);
-            builder = builder.addTransition(CONFIGURED,RESTART,RESTARTING);
-            builder = builder.addTransition(CONFIGURED,REBUILD,REBUILDING);
-            builder = builder.addTransition(CONFIGURED,STOP,STOPPING);
-            builder = builder.addTransition(CONFIGURED,CONFIG_MODIFY,CONFIGURING);
-            builder = builder.addTransition(CONFIGURED,CONFIG_SCALEOUT,CONFIGURING);
-            builder = builder.addTransition(CONFIGURED,CONFIG_RESTORE,CONFIGURING);
-            builder = builder.addTransition(CONFIGURED,HEALTHCHECK,TESTING);
-            builder = builder.addTransition(CONFIGURED,BACKUP,BACKING_UP);
-            builder = builder.addTransition(CONFIGURED,SNAPSHOT,SNAPSHOTTING);
-            builder = builder.addTransition(CONFIGURED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
-            builder = builder.addTransition(CONFIGURED,LIVE_UPGRADE,UPGRADING);
-            builder = builder.addTransition(CONFIGURED,ROLLBACK,ROLLBACKING);
-            builder = builder.addTransition(CONFIGURED,SYNC,CONFIGURED);
-            builder = builder.addTransition(CONFIGURED,AUDIT,CONFIGURED);
-            builder = builder.addTransition(CONFIGURED,MIGRATE,MIGRATING);
-            builder = builder.addTransition(CONFIGURED,EVACUATE,EVACUATING);
-            builder = builder.addTransition(CONFIGURED,LOCK,CONFIGURED);
-            builder = builder.addTransition(CONFIGURED,UNLOCK,CONFIGURED);
-            builder = builder.addTransition(CONFIGURED,CHECKLOCK,CONFIGURED);
-            builder = builder.addTransition(CONFIGURED,CONFIG_BACKUP,CONFIGURED);
-            builder = builder.addTransition(CONFIGURED,CONFIG_BACKUP_DELETE,CONFIGURED);
-            builder = builder.addTransition(CONFIGURED,CONFIG_EXPORT,CONFIGURED);
-            builder = builder.addTransition(CONFIGURED,STOP_APPLICATION,STOPPING);
-
-            builder = builder.addTransition(TESTED,CONFIGURE,CONFIGURING);
-            builder = builder.addTransition(TESTED,TEST,TESTING);
-            builder = builder.addTransition(TESTED,START,STARTING);
-            builder = builder.addTransition(TESTED,TERMINATE,TERMINATING);
-            builder = builder.addTransition(TESTED,RESTART,RESTARTING);
-            builder = builder.addTransition(TESTED,REBUILD,REBUILDING);
-            builder = builder.addTransition(TESTED,STOP,STOPPING);
-            builder = builder.addTransition(TESTED,CONFIG_MODIFY,CONFIGURING);
-            builder = builder.addTransition(TESTED,CONFIG_SCALEOUT,CONFIGURING);
-            builder = builder.addTransition(TESTED,CONFIG_RESTORE,CONFIGURING);
-            builder = builder.addTransition(TESTED,HEALTHCHECK,TESTING);
-            builder = builder.addTransition(TESTED,BACKUP,BACKING_UP);
-            builder = builder.addTransition(TESTED,SNAPSHOT,SNAPSHOTTING);
-            builder = builder.addTransition(TESTED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
-            builder = builder.addTransition(TESTED,LIVE_UPGRADE,UPGRADING);
-            builder = builder.addTransition(TESTED,ROLLBACK,ROLLBACKING);
-            builder = builder.addTransition(TESTED,SYNC,TESTED);
-            builder = builder.addTransition(TESTED,AUDIT,TESTED);
-            builder = builder.addTransition(TESTED,MIGRATE,MIGRATING);
-            builder = builder.addTransition(TESTED,EVACUATE,EVACUATING);
-            builder = builder.addTransition(TESTED,LOCK,TESTED);
-            builder = builder.addTransition(TESTED,UNLOCK,TESTED);
-            builder = builder.addTransition(TESTED,CHECKLOCK,TESTED);
-            builder = builder.addTransition(TESTED,CONFIG_BACKUP,TESTED);
-            builder = builder.addTransition(TESTED,CONFIG_BACKUP_DELETE,TESTED);
-            builder = builder.addTransition(TESTED,CONFIG_EXPORT,TESTED);
-            builder = builder.addTransition(TESTED,STOP_APPLICATION,STOPPING);
-
-            builder = builder.addTransition(RUNNING,CONFIGURE,CONFIGURING);
-            builder = builder.addTransition(RUNNING,TEST,TESTING);
-            builder = builder.addTransition(RUNNING,START,STARTING);
-            builder = builder.addTransition(RUNNING,TERMINATE,TERMINATING);
-            builder = builder.addTransition(RUNNING,RESTART,RESTARTING);
-            builder = builder.addTransition(RUNNING,REBUILD,REBUILDING);
-            builder = builder.addTransition(RUNNING,STOP,STOPPING);
-            builder = builder.addTransition(RUNNING,CONFIG_MODIFY,CONFIGURING);
-            builder = builder.addTransition(RUNNING,CONFIG_SCALEOUT,CONFIGURING);
-            builder = builder.addTransition(RUNNING,CONFIG_RESTORE,CONFIGURING);
-            builder = builder.addTransition(RUNNING,HEALTHCHECK,TESTING);
-            builder = builder.addTransition(RUNNING,BACKUP,BACKING_UP);
-            builder = builder.addTransition(RUNNING,SNAPSHOT,SNAPSHOTTING);
-            builder = builder.addTransition(RUNNING,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
-            builder = builder.addTransition(RUNNING,LIVE_UPGRADE,UPGRADING);
-            builder = builder.addTransition(RUNNING,ROLLBACK,ROLLBACKING);
-            builder = builder.addTransition(RUNNING,SYNC,RUNNING);
-            builder = builder.addTransition(RUNNING,AUDIT,RUNNING);
-            builder = builder.addTransition(RUNNING,MIGRATE,MIGRATING);
-            builder = builder.addTransition(RUNNING,EVACUATE,EVACUATING);
-            builder = builder.addTransition(RUNNING,LOCK,RUNNING);
-            builder = builder.addTransition(RUNNING,UNLOCK,RUNNING);
-            builder = builder.addTransition(RUNNING,CHECKLOCK,RUNNING);
-            builder = builder.addTransition(RUNNING,CONFIG_BACKUP,RUNNING);
-            builder = builder.addTransition(RUNNING,CONFIG_BACKUP_DELETE,RUNNING);
-            builder = builder.addTransition(RUNNING,CONFIG_EXPORT,RUNNING);
-            builder = builder.addTransition(RUNNING,STOP_APPLICATION,STOPPING);
-
-            builder = builder.addTransition(ERROR,CONFIGURE,CONFIGURING);
-            builder = builder.addTransition(ERROR,TEST,TESTING);
-            builder = builder.addTransition(ERROR,START,STARTING);
-            builder = builder.addTransition(ERROR,TERMINATE,TERMINATING);
-            builder = builder.addTransition(ERROR,RESTART,RESTARTING);
-            builder = builder.addTransition(ERROR,REBUILD,REBUILDING);
-            builder = builder.addTransition(ERROR,STOP,STOPPING);
-            builder = builder.addTransition(ERROR,CONFIG_MODIFY,CONFIGURING);
-            builder = builder.addTransition(ERROR,CONFIG_SCALEOUT,CONFIGURING);
-            builder = builder.addTransition(ERROR,CONFIG_RESTORE,CONFIGURING);
-            builder = builder.addTransition(ERROR,HEALTHCHECK,TESTING);
-            builder = builder.addTransition(ERROR,BACKUP,BACKING_UP);
-            builder = builder.addTransition(ERROR,SNAPSHOT,SNAPSHOTTING);
-            builder = builder.addTransition(ERROR,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
-            builder = builder.addTransition(ERROR,LIVE_UPGRADE,UPGRADING);
-            builder = builder.addTransition(ERROR,ROLLBACK,ROLLBACKING);
-            builder = builder.addTransition(ERROR,SYNC,ERROR);
-            builder = builder.addTransition(ERROR,AUDIT,ERROR);
-            builder = builder.addTransition(ERROR,MIGRATE,MIGRATING);
-            builder = builder.addTransition(ERROR,EVACUATE,EVACUATING);
-            builder = builder.addTransition(ERROR,LOCK,ERROR);
-            builder = builder.addTransition(ERROR,UNLOCK,ERROR);
-            builder = builder.addTransition(ERROR,CHECKLOCK,ERROR);
-            builder = builder.addTransition(ERROR,CONFIG_BACKUP,ERROR);
-            builder = builder.addTransition(ERROR,CONFIG_BACKUP_DELETE,ERROR);
-            builder = builder.addTransition(ERROR,CONFIG_EXPORT,ERROR);
-            builder = builder.addTransition(ERROR,STOP_APPLICATION,STOPPING);
-
-            builder = builder.addTransition(UNKNOWN,CONFIGURE,CONFIGURING);
-            builder = builder.addTransition(UNKNOWN,TEST,TESTING);
-            builder = builder.addTransition(UNKNOWN,START,STARTING);
-            builder = builder.addTransition(UNKNOWN,TERMINATE,TERMINATING);
-            builder = builder.addTransition(UNKNOWN,RESTART,RESTARTING);
-            builder = builder.addTransition(UNKNOWN,REBUILD,REBUILDING);
-            builder = builder.addTransition(UNKNOWN,STOP,STOPPING);
-            builder = builder.addTransition(UNKNOWN,CONFIG_MODIFY,CONFIGURING);
-            builder = builder.addTransition(UNKNOWN,CONFIG_SCALEOUT,CONFIGURING);
-            builder = builder.addTransition(UNKNOWN,CONFIG_RESTORE,CONFIGURING);
-            builder = builder.addTransition(UNKNOWN,HEALTHCHECK,TESTING);
-            builder = builder.addTransition(UNKNOWN,BACKUP,BACKING_UP);
-            builder = builder.addTransition(UNKNOWN,SNAPSHOT,SNAPSHOTTING);
-            builder = builder.addTransition(UNKNOWN,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
-            builder = builder.addTransition(UNKNOWN,LIVE_UPGRADE,UPGRADING);
-            builder = builder.addTransition(UNKNOWN,ROLLBACK,ROLLBACKING);
-            builder = builder.addTransition(UNKNOWN,SYNC,UNKNOWN);
-            builder = builder.addTransition(UNKNOWN,AUDIT,UNKNOWN);
-            builder = builder.addTransition(UNKNOWN,MIGRATE,MIGRATING);
-            builder = builder.addTransition(UNKNOWN,EVACUATE,EVACUATING);
-            builder = builder.addTransition(UNKNOWN,LOCK,UNKNOWN);
-            builder = builder.addTransition(UNKNOWN,UNLOCK,UNKNOWN);
-            builder = builder.addTransition(UNKNOWN,CHECKLOCK,UNKNOWN);
-            builder = builder.addTransition(UNKNOWN,CONFIG_BACKUP,UNKNOWN);
-            builder = builder.addTransition(UNKNOWN,CONFIG_BACKUP_DELETE,UNKNOWN);
-            builder = builder.addTransition(UNKNOWN,CONFIG_EXPORT,UNKNOWN);
-            builder = builder.addTransition(UNKNOWN,STOP_APPLICATION,STOPPING);
-
-            builder = builder.addTransition(STOPPED,CONFIGURE,CONFIGURING);
-            builder = builder.addTransition(STOPPED,TEST,TESTING);
-            builder = builder.addTransition(STOPPED,START,STARTING);
-            builder = builder.addTransition(STOPPED,TERMINATE,TERMINATING);
-            builder = builder.addTransition(STOPPED,RESTART,RESTARTING);
-            builder = builder.addTransition(STOPPED,REBUILD,REBUILDING);
-            builder = builder.addTransition(STOPPED,CONFIG_MODIFY,CONFIGURING);
-            builder = builder.addTransition(STOPPED,CONFIG_SCALEOUT,CONFIGURING);
-            builder = builder.addTransition(STOPPED,CONFIG_RESTORE,CONFIGURING);
-            builder = builder.addTransition(STOPPED,HEALTHCHECK,TESTING);
-            builder = builder.addTransition(STOPPED,BACKUP,BACKING_UP);
-            builder = builder.addTransition(STOPPED,SNAPSHOT,SNAPSHOTTING);
-            builder = builder.addTransition(STOPPED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
-            builder = builder.addTransition(STOPPED,LIVE_UPGRADE,UPGRADING);
-            builder = builder.addTransition(STOPPED,ROLLBACK,ROLLBACKING);
-            builder = builder.addTransition(STOPPED,MIGRATE,MIGRATING);
-            builder = builder.addTransition(STOPPED,EVACUATE,EVACUATING);
-            builder = builder.addTransition(STOPPED,LOCK,STOPPED);
-            builder = builder.addTransition(STOPPED,UNLOCK,STOPPED);
-            builder = builder.addTransition(STOPPED,CHECKLOCK,STOPPED);
-
-            builder = builder.addTransition(CONFIGURING,SUCCESS,CONFIGURED);
-            builder = builder.addTransition(CONFIGURING,FAILURE,ERROR);
-
-            builder = builder.addTransition(TESTING,SUCCESS,TESTED);
-            builder = builder.addTransition(TESTING,FAILURE,ERROR);
-
-            builder = builder.addTransition(RESTARTING,SUCCESS,RUNNING);
-            builder = builder.addTransition(RESTARTING,FAILURE,ERROR);
-
-            builder = builder.addTransition(STARTING,SUCCESS,RUNNING);
-            builder = builder.addTransition(STARTING,FAILURE,ERROR);
-
-            builder = builder.addTransition(TERMINATING,SUCCESS,NOT_INSTANTIATED);
-            builder = builder.addTransition(TERMINATING,FAILURE,ERROR);
-
-            builder = builder.addTransition(REBUILDING,SUCCESS,RUNNING);
-            builder = builder.addTransition(REBUILDING,FAILURE,ERROR);
-
-            builder = builder.addTransition(STOPPING,SUCCESS,STOPPED);
-            builder = builder.addTransition(STOPPING,FAILURE,ERROR);
-
-            builder = builder.addTransition(BACKING_UP,SUCCESS,RUNNING);
-            builder = builder.addTransition(BACKING_UP,FAILURE,ERROR);
-
-            builder = builder.addTransition(SNAPSHOTTING,SUCCESS,RUNNING);
-            builder = builder.addTransition(SNAPSHOTTING,FAILURE,ERROR);
-
-            builder = builder.addTransition(SOFTWARE_UPLOADING,SUCCESS,RUNNING);
-            builder = builder.addTransition(SOFTWARE_UPLOADING,FAILURE,ERROR);
-
-            builder = builder.addTransition(UPGRADING,SUCCESS,RUNNING);
-            builder = builder.addTransition(UPGRADING,FAILURE,ERROR);
-
-            builder = builder.addTransition(ROLLBACKING,SUCCESS,RUNNING);
-            builder = builder.addTransition(ROLLBACKING,FAILURE,ERROR);
-
-            builder = builder.addTransition(MIGRATING,SUCCESS,RUNNING);
-            builder = builder.addTransition(MIGRATING,FAILURE,ERROR);
-
-            builder = builder.addTransition(EVACUATING,SUCCESS,RUNNING);
-            builder = builder.addTransition(EVACUATING,FAILURE,ERROR);
-
-
-            builder = builder.addTransition(CONFIGURED,START_APPLICATION,STARTING);
-            builder = builder.addTransition(TESTED,START_APPLICATION,STARTING);
-            builder = builder.addTransition(ERROR,START_APPLICATION,STARTING);
-            builder = builder.addTransition(UNKNOWN,START_APPLICATION,STARTING);
-            builder = builder.addTransition(RUNNING,START_APPLICATION,STARTING);
-
-            return builder.build();
-
-        }
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.impl.readers;
+
+import org.openecomp.appc.statemachine.StateMetaDataReader;
+import org.openecomp.appc.lifecyclemanager.objects.VNFOperationOutcome;
+import org.openecomp.appc.statemachine.objects.Event;
+import org.openecomp.appc.statemachine.objects.State;
+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;
+
+public class VnfMetaDataReader implements StateMetaDataReader {
+
+    public enum VNFOperation {
+
+        Configure, Test, HealthCheck, Start, Terminate, Restart, Rebuild, Stop, ConfigModify,
+        ConfigScaleOut,ConfigRestore,Backup, Snapshot,
+        SoftwareUpload, LiveUpgrade, Rollback, Sync, Audit, Test_lic, Migrate, Evacuate,
+        ConfigBackup, ConfigBackupDelete, ConfigExport,
+        Lock(true), Unlock(true), CheckLock(true), StartApplication,StopApplication;
+
+        private boolean builtIn;
+
+        VNFOperation(boolean builtIn) {
+            this.builtIn = builtIn;
+        }
+
+        VNFOperation() {
+            this(false);
+        }
+    }
+
+    private enum VNFStates {
+        Not_Instantiated, Instantiated, Configuring, Configured, Testing, Tested, Rebuilding, Restarting, Starting,
+        Error, Running, Unknown, Terminating, Stopping, Stopped,
+        Backing_Up, Snapshotting, Software_Uploading, Upgrading, Rollbacking, Licensing, Migrating, Evacuating,
+        NOT_ORCHESTRATED("NOT ORCHESTRATED"), Created;
+
+        String stateName;
+
+        VNFStates(String name) {
+            this.stateName = name;
+        }
+
+        VNFStates() {
+            this.stateName = name();
+        }
+
+        @Override
+        public String toString() {
+            return this.stateName;
+        }
+    }
+
+    public StateMachineMetadata readMetadata() {
+        {
+            State NOT_INSTANTIATED = new State(VNFStates.Not_Instantiated.toString());
+            State INSTANTIATED = new State(VNFStates.Instantiated.toString());
+            State CONFIGURING = new State(VNFStates.Configuring.toString());
+            State CONFIGURED = new State(VNFStates.Configured.toString());
+            State TESTING = new State(VNFStates.Testing.toString());
+            State TESTED = new State(VNFStates.Tested.toString());
+            State REBUILDING = new State(VNFStates.Rebuilding.toString());
+            State RESTARTING = new State(VNFStates.Restarting.toString());
+            State STARTING = new State(VNFStates.Starting.toString());
+            State ERROR = new State(VNFStates.Error.toString());
+            State RUNNING = new State(VNFStates.Running.toString());
+            State UNKNOWN = new State(VNFStates.Unknown.toString());
+            State TERMINATING = new State(VNFStates.Terminating.toString());
+            State STOPPING = new State(VNFStates.Stopping.toString());
+            State STOPPED = new State(VNFStates.Stopped.toString());
+            State NOT_ORCHESTRATED = new State(VNFStates.NOT_ORCHESTRATED.toString());
+
+            State BACKING_UP = new State(VNFStates.Backing_Up.toString());
+            State SNAPSHOTTING = new State(VNFStates.Snapshotting.toString());
+            State SOFTWARE_UPLOADING = new State(VNFStates.Software_Uploading.toString());
+            State UPGRADING = new State(VNFStates.Upgrading.toString());
+            State ROLLBACKING = new State(VNFStates.Rollbacking.toString());
+
+            State MIGRATING = new State(VNFStates.Migrating.toString());
+            State EVACUATING = new State(VNFStates.Evacuating.toString());
+            State CREATED= new State(VNFStates.Created.toString());
+
+            Event START_APPLICATION = new Event(VNFOperation.StartApplication.toString());
+            Event CONFIGURE = new Event(VNFOperation.Configure.toString());
+            Event HEALTHCHECK = new Event(VNFOperation.HealthCheck.toString());
+            Event TEST = new Event(VNFOperation.Test.toString());
+            Event START = new Event(VNFOperation.Start.toString());
+            Event TERMINATE = new Event(VNFOperation.Terminate.toString());
+            Event RESTART = new Event(VNFOperation.Restart.toString());
+            Event REBUILD = new Event(VNFOperation.Rebuild.toString());
+            Event STOP = new Event(VNFOperation.Stop.toString());
+            Event CONFIG_MODIFY = new Event(VNFOperation.ConfigModify.toString());
+            Event CONFIG_SCALEOUT = new Event(VNFOperation.ConfigScaleOut.toString());
+            Event CONFIG_RESTORE = new Event(VNFOperation.ConfigRestore.toString());
+            Event BACKUP = new Event(VNFOperation.Backup.toString());
+            Event SNAPSHOT = new Event(VNFOperation.Snapshot.toString());
+            Event SOFTWARE_UPLOAD = new Event(VNFOperation.SoftwareUpload.toString());
+            Event LIVE_UPGRADE = new Event(VNFOperation.LiveUpgrade.toString());
+            Event ROLLBACK = new Event(VNFOperation.Rollback.toString());
+            Event SYNC = new Event(VNFOperation.Sync.toString());
+            Event AUDIT = new Event(VNFOperation.Audit.toString());
+            Event MIGRATE = new Event(VNFOperation.Migrate.toString());
+            Event EVACUATE = new Event(VNFOperation.Evacuate.toString());
+            Event CONFIG_BACKUP = new Event(VNFOperation.ConfigBackup.toString());
+            Event CONFIG_BACKUP_DELETE = new Event(VNFOperation.ConfigBackupDelete.toString());
+            Event CONFIG_EXPORT = new Event(VNFOperation.ConfigExport.toString());
+            Event STOP_APPLICATION= new Event(VNFOperation.StopApplication.toString());
+
+            Event LOCK = new Event(VNFOperation.Lock.toString());
+            Event UNLOCK = new Event(VNFOperation.Unlock.toString());
+            Event CHECKLOCK = new Event(VNFOperation.CheckLock.toString());
+
+            Event SUCCESS = new Event(VNFOperationOutcome.SUCCESS.toString());
+            Event FAILURE = new Event(VNFOperationOutcome.FAILURE.toString());
+
+
+            StateMachineMetadata.StateMachineMetadataBuilder builder = new StateMachineMetadata.StateMachineMetadataBuilder();
+
+            builder = builder.addState(NOT_INSTANTIATED);
+            builder = builder.addState(INSTANTIATED);
+            builder = builder.addState(CONFIGURING);
+            builder = builder.addState(CONFIGURED);
+            builder = builder.addState(TESTING);
+            builder = builder.addState(TESTED);
+            builder = builder.addState(REBUILDING);
+            builder = builder.addState(RESTARTING);
+            builder = builder.addState(STARTING);
+            builder = builder.addState(ERROR);
+            builder = builder.addState(RUNNING);
+            builder = builder.addState(UNKNOWN);
+            builder = builder.addState(TERMINATING);
+            builder = builder.addState(STOPPING);
+            builder = builder.addState(STOPPED);
+
+            builder = builder.addState(BACKING_UP);
+            builder = builder.addState(SNAPSHOTTING);
+            builder = builder.addState(SOFTWARE_UPLOADING);
+            builder = builder.addState(UPGRADING);
+            builder = builder.addState(ROLLBACKING);
+            builder = builder.addState(MIGRATING);
+            builder = builder.addState(EVACUATING);
+            builder = builder.addState(NOT_ORCHESTRATED);
+            builder = builder.addState(CREATED);
+            builder = builder.addEvent(START_APPLICATION);
+            builder = builder.addEvent(CONFIGURE);
+            builder = builder.addEvent(TEST);
+            builder = builder.addEvent(START);
+            builder = builder.addEvent(TERMINATE);
+            builder = builder.addEvent(RESTART);
+            builder = builder.addEvent(REBUILD);
+            builder = builder.addEvent(SUCCESS);
+            builder = builder.addEvent(FAILURE);
+            builder = builder.addEvent(STOP);
+            builder = builder.addEvent(CONFIG_MODIFY);
+            builder = builder.addEvent(CONFIG_SCALEOUT);
+            builder = builder.addEvent(CONFIG_RESTORE);
+            builder = builder.addEvent(HEALTHCHECK);
+            builder = builder.addEvent(BACKUP);
+            builder = builder.addEvent(SNAPSHOT);
+            builder = builder.addEvent(SOFTWARE_UPLOAD);
+            builder = builder.addEvent(LIVE_UPGRADE);
+            builder = builder.addEvent(ROLLBACK);
+            builder = builder.addEvent(SYNC);
+            builder = builder.addEvent(AUDIT);
+            builder = builder.addEvent(MIGRATE);
+            builder = builder.addEvent(EVACUATE);
+            builder = builder.addEvent(LOCK);
+            builder = builder.addEvent(UNLOCK);
+            builder = builder.addEvent(CHECKLOCK);
+            builder = builder.addEvent(CONFIG_BACKUP);
+            builder = builder.addEvent(CONFIG_BACKUP_DELETE);
+            builder = builder.addEvent(CONFIG_EXPORT);
+            builder = builder.addEvent(STOP_APPLICATION);
+
+            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIGURE,CONFIGURING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,TEST,TESTING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,START,STARTING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,TERMINATE,TERMINATING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,RESTART,RESTARTING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,REBUILD,REBUILDING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,STOP,STOPPING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_MODIFY,CONFIGURING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_SCALEOUT,CONFIGURING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_RESTORE,CONFIGURING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,HEALTHCHECK,TESTING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,BACKUP,BACKING_UP);
+            builder = builder.addTransition(NOT_ORCHESTRATED,SNAPSHOT,SNAPSHOTTING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,LIVE_UPGRADE,UPGRADING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,ROLLBACK,ROLLBACKING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,MIGRATE,MIGRATING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,EVACUATE,EVACUATING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,LOCK,NOT_ORCHESTRATED);
+            builder = builder.addTransition(NOT_ORCHESTRATED,UNLOCK,NOT_ORCHESTRATED);
+            builder = builder.addTransition(NOT_ORCHESTRATED,CHECKLOCK,NOT_ORCHESTRATED);
+            builder = builder.addTransition(NOT_ORCHESTRATED,START_APPLICATION,STARTING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,STOP_APPLICATION,STOPPING);
+            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_BACKUP,NOT_ORCHESTRATED);
+
+            builder = builder.addTransition(CREATED,CONFIGURE,CONFIGURING);
+            builder = builder.addTransition(CREATED,TEST,TESTING);
+            builder = builder.addTransition(CREATED,START,STARTING);
+            builder = builder.addTransition(CREATED,TERMINATE,TERMINATING);
+            builder = builder.addTransition(CREATED,RESTART,RESTARTING);
+            builder = builder.addTransition(CREATED,REBUILD,REBUILDING);
+            builder = builder.addTransition(CREATED,STOP,STOPPING);
+            builder = builder.addTransition(CREATED,CONFIG_MODIFY,CONFIGURING);
+            builder = builder.addTransition(CREATED,CONFIG_SCALEOUT,CONFIGURING);
+            builder = builder.addTransition(CREATED,CONFIG_RESTORE,CONFIGURING);
+            builder = builder.addTransition(CREATED,HEALTHCHECK,TESTING);
+            builder = builder.addTransition(CREATED,BACKUP,BACKING_UP);
+            builder = builder.addTransition(CREATED,SNAPSHOT,SNAPSHOTTING);
+            builder = builder.addTransition(CREATED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
+            builder = builder.addTransition(CREATED,LIVE_UPGRADE,UPGRADING);
+            builder = builder.addTransition(CREATED,ROLLBACK,ROLLBACKING);
+            builder = builder.addTransition(CREATED,MIGRATE,MIGRATING);
+            builder = builder.addTransition(CREATED,EVACUATE,EVACUATING);
+            builder = builder.addTransition(CREATED,LOCK,CREATED);
+            builder = builder.addTransition(CREATED,UNLOCK,CREATED);
+            builder = builder.addTransition(CREATED,CHECKLOCK,CREATED);
+            builder = builder.addTransition(CREATED,START_APPLICATION,STARTING);
+            builder = builder.addTransition(CREATED,STOP_APPLICATION,STOPPING);
+            builder = builder.addTransition(CREATED,CONFIG_BACKUP,CREATED);
+
+            builder = builder.addTransition(INSTANTIATED,CONFIGURE,CONFIGURING);
+            builder = builder.addTransition(INSTANTIATED,TEST,TESTING);
+            builder = builder.addTransition(INSTANTIATED,START,STARTING);
+            builder = builder.addTransition(INSTANTIATED,TERMINATE,TERMINATING);
+            builder = builder.addTransition(INSTANTIATED,RESTART,RESTARTING);
+            builder = builder.addTransition(INSTANTIATED,REBUILD,REBUILDING);
+            builder = builder.addTransition(INSTANTIATED,STOP,STOPPING);
+            builder = builder.addTransition(INSTANTIATED,CONFIG_MODIFY,CONFIGURING);
+            builder = builder.addTransition(INSTANTIATED,CONFIG_SCALEOUT,CONFIGURING);
+            builder = builder.addTransition(INSTANTIATED,CONFIG_RESTORE,CONFIGURING);
+            builder = builder.addTransition(INSTANTIATED,HEALTHCHECK,TESTING);
+            builder = builder.addTransition(INSTANTIATED,BACKUP,BACKING_UP);
+            builder = builder.addTransition(INSTANTIATED,SNAPSHOT,SNAPSHOTTING);
+            builder = builder.addTransition(INSTANTIATED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
+            builder = builder.addTransition(INSTANTIATED,LIVE_UPGRADE,UPGRADING);
+            builder = builder.addTransition(INSTANTIATED,ROLLBACK,ROLLBACKING);
+            builder = builder.addTransition(INSTANTIATED,MIGRATE,MIGRATING);
+            builder = builder.addTransition(INSTANTIATED,EVACUATE,EVACUATING);
+            builder = builder.addTransition(INSTANTIATED,LOCK,INSTANTIATED);
+            builder = builder.addTransition(INSTANTIATED,UNLOCK,INSTANTIATED);
+            builder = builder.addTransition(INSTANTIATED,CHECKLOCK,INSTANTIATED);
+
+            builder = builder.addTransition(CONFIGURED,CONFIGURE,CONFIGURING);
+            builder = builder.addTransition(CONFIGURED,TEST,TESTING);
+            builder = builder.addTransition(CONFIGURED,START,STARTING);
+            builder = builder.addTransition(CONFIGURED,TERMINATE,TERMINATING);
+            builder = builder.addTransition(CONFIGURED,RESTART,RESTARTING);
+            builder = builder.addTransition(CONFIGURED,REBUILD,REBUILDING);
+            builder = builder.addTransition(CONFIGURED,STOP,STOPPING);
+            builder = builder.addTransition(CONFIGURED,CONFIG_MODIFY,CONFIGURING);
+            builder = builder.addTransition(CONFIGURED,CONFIG_SCALEOUT,CONFIGURING);
+            builder = builder.addTransition(CONFIGURED,CONFIG_RESTORE,CONFIGURING);
+            builder = builder.addTransition(CONFIGURED,HEALTHCHECK,TESTING);
+            builder = builder.addTransition(CONFIGURED,BACKUP,BACKING_UP);
+            builder = builder.addTransition(CONFIGURED,SNAPSHOT,SNAPSHOTTING);
+            builder = builder.addTransition(CONFIGURED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
+            builder = builder.addTransition(CONFIGURED,LIVE_UPGRADE,UPGRADING);
+            builder = builder.addTransition(CONFIGURED,ROLLBACK,ROLLBACKING);
+            builder = builder.addTransition(CONFIGURED,SYNC,CONFIGURED);
+            builder = builder.addTransition(CONFIGURED,AUDIT,CONFIGURED);
+            builder = builder.addTransition(CONFIGURED,MIGRATE,MIGRATING);
+            builder = builder.addTransition(CONFIGURED,EVACUATE,EVACUATING);
+            builder = builder.addTransition(CONFIGURED,LOCK,CONFIGURED);
+            builder = builder.addTransition(CONFIGURED,UNLOCK,CONFIGURED);
+            builder = builder.addTransition(CONFIGURED,CHECKLOCK,CONFIGURED);
+            builder = builder.addTransition(CONFIGURED,CONFIG_BACKUP,CONFIGURED);
+            builder = builder.addTransition(CONFIGURED,CONFIG_BACKUP_DELETE,CONFIGURED);
+            builder = builder.addTransition(CONFIGURED,CONFIG_EXPORT,CONFIGURED);
+            builder = builder.addTransition(CONFIGURED,STOP_APPLICATION,STOPPING);
+
+            builder = builder.addTransition(TESTED,CONFIGURE,CONFIGURING);
+            builder = builder.addTransition(TESTED,TEST,TESTING);
+            builder = builder.addTransition(TESTED,START,STARTING);
+            builder = builder.addTransition(TESTED,TERMINATE,TERMINATING);
+            builder = builder.addTransition(TESTED,RESTART,RESTARTING);
+            builder = builder.addTransition(TESTED,REBUILD,REBUILDING);
+            builder = builder.addTransition(TESTED,STOP,STOPPING);
+            builder = builder.addTransition(TESTED,CONFIG_MODIFY,CONFIGURING);
+            builder = builder.addTransition(TESTED,CONFIG_SCALEOUT,CONFIGURING);
+            builder = builder.addTransition(TESTED,CONFIG_RESTORE,CONFIGURING);
+            builder = builder.addTransition(TESTED,HEALTHCHECK,TESTING);
+            builder = builder.addTransition(TESTED,BACKUP,BACKING_UP);
+            builder = builder.addTransition(TESTED,SNAPSHOT,SNAPSHOTTING);
+            builder = builder.addTransition(TESTED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
+            builder = builder.addTransition(TESTED,LIVE_UPGRADE,UPGRADING);
+            builder = builder.addTransition(TESTED,ROLLBACK,ROLLBACKING);
+            builder = builder.addTransition(TESTED,SYNC,TESTED);
+            builder = builder.addTransition(TESTED,AUDIT,TESTED);
+            builder = builder.addTransition(TESTED,MIGRATE,MIGRATING);
+            builder = builder.addTransition(TESTED,EVACUATE,EVACUATING);
+            builder = builder.addTransition(TESTED,LOCK,TESTED);
+            builder = builder.addTransition(TESTED,UNLOCK,TESTED);
+            builder = builder.addTransition(TESTED,CHECKLOCK,TESTED);
+            builder = builder.addTransition(TESTED,CONFIG_BACKUP,TESTED);
+            builder = builder.addTransition(TESTED,CONFIG_BACKUP_DELETE,TESTED);
+            builder = builder.addTransition(TESTED,CONFIG_EXPORT,TESTED);
+            builder = builder.addTransition(TESTED,STOP_APPLICATION,STOPPING);
+
+            builder = builder.addTransition(RUNNING,CONFIGURE,CONFIGURING);
+            builder = builder.addTransition(RUNNING,TEST,TESTING);
+            builder = builder.addTransition(RUNNING,START,STARTING);
+            builder = builder.addTransition(RUNNING,TERMINATE,TERMINATING);
+            builder = builder.addTransition(RUNNING,RESTART,RESTARTING);
+            builder = builder.addTransition(RUNNING,REBUILD,REBUILDING);
+            builder = builder.addTransition(RUNNING,STOP,STOPPING);
+            builder = builder.addTransition(RUNNING,CONFIG_MODIFY,CONFIGURING);
+            builder = builder.addTransition(RUNNING,CONFIG_SCALEOUT,CONFIGURING);
+            builder = builder.addTransition(RUNNING,CONFIG_RESTORE,CONFIGURING);
+            builder = builder.addTransition(RUNNING,HEALTHCHECK,TESTING);
+            builder = builder.addTransition(RUNNING,BACKUP,BACKING_UP);
+            builder = builder.addTransition(RUNNING,SNAPSHOT,SNAPSHOTTING);
+            builder = builder.addTransition(RUNNING,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
+            builder = builder.addTransition(RUNNING,LIVE_UPGRADE,UPGRADING);
+            builder = builder.addTransition(RUNNING,ROLLBACK,ROLLBACKING);
+            builder = builder.addTransition(RUNNING,SYNC,RUNNING);
+            builder = builder.addTransition(RUNNING,AUDIT,RUNNING);
+            builder = builder.addTransition(RUNNING,MIGRATE,MIGRATING);
+            builder = builder.addTransition(RUNNING,EVACUATE,EVACUATING);
+            builder = builder.addTransition(RUNNING,LOCK,RUNNING);
+            builder = builder.addTransition(RUNNING,UNLOCK,RUNNING);
+            builder = builder.addTransition(RUNNING,CHECKLOCK,RUNNING);
+            builder = builder.addTransition(RUNNING,CONFIG_BACKUP,RUNNING);
+            builder = builder.addTransition(RUNNING,CONFIG_BACKUP_DELETE,RUNNING);
+            builder = builder.addTransition(RUNNING,CONFIG_EXPORT,RUNNING);
+            builder = builder.addTransition(RUNNING,STOP_APPLICATION,STOPPING);
+
+            builder = builder.addTransition(ERROR,CONFIGURE,CONFIGURING);
+            builder = builder.addTransition(ERROR,TEST,TESTING);
+            builder = builder.addTransition(ERROR,START,STARTING);
+            builder = builder.addTransition(ERROR,TERMINATE,TERMINATING);
+            builder = builder.addTransition(ERROR,RESTART,RESTARTING);
+            builder = builder.addTransition(ERROR,REBUILD,REBUILDING);
+            builder = builder.addTransition(ERROR,STOP,STOPPING);
+            builder = builder.addTransition(ERROR,CONFIG_MODIFY,CONFIGURING);
+            builder = builder.addTransition(ERROR,CONFIG_SCALEOUT,CONFIGURING);
+            builder = builder.addTransition(ERROR,CONFIG_RESTORE,CONFIGURING);
+            builder = builder.addTransition(ERROR,HEALTHCHECK,TESTING);
+            builder = builder.addTransition(ERROR,BACKUP,BACKING_UP);
+            builder = builder.addTransition(ERROR,SNAPSHOT,SNAPSHOTTING);
+            builder = builder.addTransition(ERROR,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
+            builder = builder.addTransition(ERROR,LIVE_UPGRADE,UPGRADING);
+            builder = builder.addTransition(ERROR,ROLLBACK,ROLLBACKING);
+            builder = builder.addTransition(ERROR,SYNC,ERROR);
+            builder = builder.addTransition(ERROR,AUDIT,ERROR);
+            builder = builder.addTransition(ERROR,MIGRATE,MIGRATING);
+            builder = builder.addTransition(ERROR,EVACUATE,EVACUATING);
+            builder = builder.addTransition(ERROR,LOCK,ERROR);
+            builder = builder.addTransition(ERROR,UNLOCK,ERROR);
+            builder = builder.addTransition(ERROR,CHECKLOCK,ERROR);
+            builder = builder.addTransition(ERROR,CONFIG_BACKUP,ERROR);
+            builder = builder.addTransition(ERROR,CONFIG_BACKUP_DELETE,ERROR);
+            builder = builder.addTransition(ERROR,CONFIG_EXPORT,ERROR);
+            builder = builder.addTransition(ERROR,STOP_APPLICATION,STOPPING);
+
+            builder = builder.addTransition(UNKNOWN,CONFIGURE,CONFIGURING);
+            builder = builder.addTransition(UNKNOWN,TEST,TESTING);
+            builder = builder.addTransition(UNKNOWN,START,STARTING);
+            builder = builder.addTransition(UNKNOWN,TERMINATE,TERMINATING);
+            builder = builder.addTransition(UNKNOWN,RESTART,RESTARTING);
+            builder = builder.addTransition(UNKNOWN,REBUILD,REBUILDING);
+            builder = builder.addTransition(UNKNOWN,STOP,STOPPING);
+            builder = builder.addTransition(UNKNOWN,CONFIG_MODIFY,CONFIGURING);
+            builder = builder.addTransition(UNKNOWN,CONFIG_SCALEOUT,CONFIGURING);
+            builder = builder.addTransition(UNKNOWN,CONFIG_RESTORE,CONFIGURING);
+            builder = builder.addTransition(UNKNOWN,HEALTHCHECK,TESTING);
+            builder = builder.addTransition(UNKNOWN,BACKUP,BACKING_UP);
+            builder = builder.addTransition(UNKNOWN,SNAPSHOT,SNAPSHOTTING);
+            builder = builder.addTransition(UNKNOWN,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
+            builder = builder.addTransition(UNKNOWN,LIVE_UPGRADE,UPGRADING);
+            builder = builder.addTransition(UNKNOWN,ROLLBACK,ROLLBACKING);
+            builder = builder.addTransition(UNKNOWN,SYNC,UNKNOWN);
+            builder = builder.addTransition(UNKNOWN,AUDIT,UNKNOWN);
+            builder = builder.addTransition(UNKNOWN,MIGRATE,MIGRATING);
+            builder = builder.addTransition(UNKNOWN,EVACUATE,EVACUATING);
+            builder = builder.addTransition(UNKNOWN,LOCK,UNKNOWN);
+            builder = builder.addTransition(UNKNOWN,UNLOCK,UNKNOWN);
+            builder = builder.addTransition(UNKNOWN,CHECKLOCK,UNKNOWN);
+            builder = builder.addTransition(UNKNOWN,CONFIG_BACKUP,UNKNOWN);
+            builder = builder.addTransition(UNKNOWN,CONFIG_BACKUP_DELETE,UNKNOWN);
+            builder = builder.addTransition(UNKNOWN,CONFIG_EXPORT,UNKNOWN);
+            builder = builder.addTransition(UNKNOWN,STOP_APPLICATION,STOPPING);
+
+            builder = builder.addTransition(STOPPED,CONFIGURE,CONFIGURING);
+            builder = builder.addTransition(STOPPED,TEST,TESTING);
+            builder = builder.addTransition(STOPPED,START,STARTING);
+            builder = builder.addTransition(STOPPED,TERMINATE,TERMINATING);
+            builder = builder.addTransition(STOPPED,RESTART,RESTARTING);
+            builder = builder.addTransition(STOPPED,REBUILD,REBUILDING);
+            builder = builder.addTransition(STOPPED,CONFIG_MODIFY,CONFIGURING);
+            builder = builder.addTransition(STOPPED,CONFIG_SCALEOUT,CONFIGURING);
+            builder = builder.addTransition(STOPPED,CONFIG_RESTORE,CONFIGURING);
+            builder = builder.addTransition(STOPPED,HEALTHCHECK,TESTING);
+            builder = builder.addTransition(STOPPED,BACKUP,BACKING_UP);
+            builder = builder.addTransition(STOPPED,SNAPSHOT,SNAPSHOTTING);
+            builder = builder.addTransition(STOPPED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);
+            builder = builder.addTransition(STOPPED,LIVE_UPGRADE,UPGRADING);
+            builder = builder.addTransition(STOPPED,ROLLBACK,ROLLBACKING);
+            builder = builder.addTransition(STOPPED,MIGRATE,MIGRATING);
+            builder = builder.addTransition(STOPPED,EVACUATE,EVACUATING);
+            builder = builder.addTransition(STOPPED,LOCK,STOPPED);
+            builder = builder.addTransition(STOPPED,UNLOCK,STOPPED);
+            builder = builder.addTransition(STOPPED,CHECKLOCK,STOPPED);
+
+            builder = builder.addTransition(CONFIGURING,SUCCESS,CONFIGURED);
+            builder = builder.addTransition(CONFIGURING,FAILURE,ERROR);
+
+            builder = builder.addTransition(TESTING,SUCCESS,TESTED);
+            builder = builder.addTransition(TESTING,FAILURE,ERROR);
+
+            builder = builder.addTransition(RESTARTING,SUCCESS,RUNNING);
+            builder = builder.addTransition(RESTARTING,FAILURE,ERROR);
+
+            builder = builder.addTransition(STARTING,SUCCESS,RUNNING);
+            builder = builder.addTransition(STARTING,FAILURE,ERROR);
+
+            builder = builder.addTransition(TERMINATING,SUCCESS,NOT_INSTANTIATED);
+            builder = builder.addTransition(TERMINATING,FAILURE,ERROR);
+
+            builder = builder.addTransition(REBUILDING,SUCCESS,RUNNING);
+            builder = builder.addTransition(REBUILDING,FAILURE,ERROR);
+
+            builder = builder.addTransition(STOPPING,SUCCESS,STOPPED);
+            builder = builder.addTransition(STOPPING,FAILURE,ERROR);
+
+            builder = builder.addTransition(BACKING_UP,SUCCESS,RUNNING);
+            builder = builder.addTransition(BACKING_UP,FAILURE,ERROR);
+
+            builder = builder.addTransition(SNAPSHOTTING,SUCCESS,RUNNING);
+            builder = builder.addTransition(SNAPSHOTTING,FAILURE,ERROR);
+
+            builder = builder.addTransition(SOFTWARE_UPLOADING,SUCCESS,RUNNING);
+            builder = builder.addTransition(SOFTWARE_UPLOADING,FAILURE,ERROR);
+
+            builder = builder.addTransition(UPGRADING,SUCCESS,RUNNING);
+            builder = builder.addTransition(UPGRADING,FAILURE,ERROR);
+
+            builder = builder.addTransition(ROLLBACKING,SUCCESS,RUNNING);
+            builder = builder.addTransition(ROLLBACKING,FAILURE,ERROR);
+
+            builder = builder.addTransition(MIGRATING,SUCCESS,RUNNING);
+            builder = builder.addTransition(MIGRATING,FAILURE,ERROR);
+
+            builder = builder.addTransition(EVACUATING,SUCCESS,RUNNING);
+            builder = builder.addTransition(EVACUATING,FAILURE,ERROR);
+
+
+            builder = builder.addTransition(CONFIGURED,START_APPLICATION,STARTING);
+            builder = builder.addTransition(TESTED,START_APPLICATION,STARTING);
+            builder = builder.addTransition(ERROR,START_APPLICATION,STARTING);
+            builder = builder.addTransition(UNKNOWN,START_APPLICATION,STARTING);
+            builder = builder.addTransition(RUNNING,START_APPLICATION,STARTING);
+
+            return builder.build();
+
+        }
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Event.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Event.java
index 0808b1b..33de607 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Event.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Event.java
@@ -1,65 +1,65 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.objects;
-
-public class Event{
-
-    private String eventName;
-
-    private Event(){
-        // do nothing
-    }
-
-    @Override
-    public int hashCode(){
-        return this.eventName.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj){
-        if(obj == null){
-            return false;
-        }
-        if(!(obj instanceof Event)){
-            return false;
-        }
-        Event event = (Event)obj;
-        return this.eventName.equals(event.getEventName());
-    }
-
-    public Event(String eventName){
-        this();
-        this.eventName = eventName;
-    }
-
-    private String getEventName() {
-        return eventName;
-    }
-
-    @Override
-    public String toString(){
-        return this.eventName;
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.objects;
+
+public class Event{
+
+    private String eventName;
+
+    private Event(){
+        // do nothing
+    }
+
+    @Override
+    public int hashCode(){
+        return this.eventName.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj){
+        if(obj == null){
+            return false;
+        }
+        if(!(obj instanceof Event)){
+            return false;
+        }
+        Event event = (Event)obj;
+        return this.eventName.equals(event.getEventName());
+    }
+
+    public Event(String eventName){
+        this();
+        this.eventName = eventName;
+    }
+
+    private String getEventName() {
+        return eventName;
+    }
+
+    @Override
+    public String toString(){
+        return this.eventName;
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Response.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Response.java
index 622a427..3620120 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Response.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Response.java
@@ -1,32 +1,32 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.objects;
-
-public enum Response {
-    NO_TRANSITION_DEFINED,NO_STATE_CHANGE,VALID_TRANSITION;
-    public String toString(){
-        return this.name();
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.objects;
+
+public enum Response {
+    NO_TRANSITION_DEFINED,NO_STATE_CHANGE,VALID_TRANSITION;
+    public String toString(){
+        return this.name();
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/State.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/State.java
index 99d6a0a..8dc8c3c 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/State.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/State.java
@@ -1,77 +1,77 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.objects;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class State{
-    private String stateName;
-    private List<Transition> transitions;
-
-    private State(){
-        // do nothing
-    }
-
-    public State(String state){
-        this();
-        this.stateName = state;
-        this.transitions = new ArrayList<>();
-    }
-
-    @Override
-    public int hashCode(){
-        return this.stateName.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj){
-        if(obj == null){
-            return false;
-        }
-        if(!(obj instanceof State)){
-            return false;
-        }
-        State state = (State)obj;
-        return this.stateName.equalsIgnoreCase(state.getStateName());
-    }
-
-    public String getStateName(){
-        return stateName;
-    }
-
-    void addTransition(Transition transition){
-        this.transitions.add(transition);
-    }
-
-    public List<Transition> getTransitions() {
-        return transitions;
-    }
-
-    @Override
-    public String toString(){
-        return this.stateName;
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.objects;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class State{
+    private String stateName;
+    private List<Transition> transitions;
+
+    private State(){
+        // do nothing
+    }
+
+    public State(String state){
+        this();
+        this.stateName = state;
+        this.transitions = new ArrayList<>();
+    }
+
+    @Override
+    public int hashCode(){
+        return this.stateName.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj){
+        if(obj == null){
+            return false;
+        }
+        if(!(obj instanceof State)){
+            return false;
+        }
+        State state = (State)obj;
+        return this.stateName.equalsIgnoreCase(state.getStateName());
+    }
+
+    public String getStateName(){
+        return stateName;
+    }
+
+    void addTransition(Transition transition){
+        this.transitions.add(transition);
+    }
+
+    public List<Transition> getTransitions() {
+        return transitions;
+    }
+
+    @Override
+    public String toString(){
+        return this.stateName;
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineMetadata.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineMetadata.java
index 5a8984c..e985c76 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineMetadata.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineMetadata.java
@@ -1,78 +1,78 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.objects;
-
-import java.util.HashSet;
-import java.util.Set;
-
-public class StateMachineMetadata {
-
-    private Set<State> states;
-    private Set<Event> events;
-
-    private StateMachineMetadata(StateMachineMetadataBuilder builder){
-        states = builder.states;
-        events = builder.events;
-    }
-
-    public Set<State> getStates() {
-        return states;
-    }
-
-    public Set<Event> getEvents() {
-        return events;
-    }
-
-    public static class StateMachineMetadataBuilder{
-
-        private Set<State> states;
-        private Set<Event> events;
-
-        public StateMachineMetadataBuilder(){
-            states = new HashSet<>();
-            events = new HashSet<>();
-        }
-
-        public StateMachineMetadataBuilder addState(State state){
-            this.states.add(state);
-            return this;
-        }
-
-        public StateMachineMetadataBuilder addEvent(Event event){
-            this.events.add(event);
-            return this;
-        }
-
-        public StateMachineMetadataBuilder addTransition(State currentState,Event event,State nextState){
-            Transition transition = new Transition(event,nextState);
-            currentState.addTransition(transition);
-            return this;
-        }
-
-        public StateMachineMetadata build(){
-            return new StateMachineMetadata(this);
-        }
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.objects;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class StateMachineMetadata {
+
+    private Set<State> states;
+    private Set<Event> events;
+
+    private StateMachineMetadata(StateMachineMetadataBuilder builder){
+        states = builder.states;
+        events = builder.events;
+    }
+
+    public Set<State> getStates() {
+        return states;
+    }
+
+    public Set<Event> getEvents() {
+        return events;
+    }
+
+    public static class StateMachineMetadataBuilder{
+
+        private Set<State> states;
+        private Set<Event> events;
+
+        public StateMachineMetadataBuilder(){
+            states = new HashSet<>();
+            events = new HashSet<>();
+        }
+
+        public StateMachineMetadataBuilder addState(State state){
+            this.states.add(state);
+            return this;
+        }
+
+        public StateMachineMetadataBuilder addEvent(Event event){
+            this.events.add(event);
+            return this;
+        }
+
+        public StateMachineMetadataBuilder addTransition(State currentState,Event event,State nextState){
+            Transition transition = new Transition(event,nextState);
+            currentState.addTransition(transition);
+            return this;
+        }
+
+        public StateMachineMetadata build(){
+            return new StateMachineMetadata(this);
+        }
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineResponse.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineResponse.java
index 7f78087..0b1c8e2 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineResponse.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineResponse.java
@@ -1,51 +1,51 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.objects;
-
-
-public class StateMachineResponse {
-    private State nextState;
-    private Response response;
-
-    public StateMachineResponse(){
-        // do nothing
-    }
-
-    public State getNextState() {
-        return nextState;
-    }
-
-    public Response getResponse() {
-        return response;
-    }
-
-    public void setNextState(State nextState) {
-        this.nextState = nextState;
-    }
-
-    public void setResponse(Response response) {
-        this.response = response;
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.objects;
+
+
+public class StateMachineResponse {
+    private State nextState;
+    private Response response;
+
+    public StateMachineResponse(){
+        // do nothing
+    }
+
+    public State getNextState() {
+        return nextState;
+    }
+
+    public Response getResponse() {
+        return response;
+    }
+
+    public void setNextState(State nextState) {
+        this.nextState = nextState;
+    }
+
+    public void setResponse(Response response) {
+        this.response = response;
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Transition.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Transition.java
index b050268..d777ef8 100644
--- a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Transition.java
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Transition.java
@@ -1,48 +1,48 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.objects;
-
-public class Transition {
-    private Event event;
-    private State nextState;
-
-    private Transition(){
-        // do nothing
-    }
-
-    Transition(Event event, State nextState){
-        this();
-        this.event = event;
-        this.nextState = nextState;
-    }
-
-    public Event getEvent() {
-        return event;
-    }
-
-    public State getNextState() {
-        return nextState;
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.objects;
+
+public class Transition {
+    private Event event;
+    private State nextState;
+
+    private Transition(){
+        // do nothing
+    }
+
+    Transition(Event event, State nextState){
+        this();
+        this.event = event;
+        this.nextState = nextState;
+    }
+
+    public Event getEvent() {
+        return event;
+    }
+
+    public State getNextState() {
+        return nextState;
+    }
+}
diff --git a/appc-lifecycle-management/state-machine-lib/src/test/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStatesTest.java b/appc-lifecycle-management/state-machine-lib/src/test/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStatesTest.java
index af08234..01afd14 100644
--- a/appc-lifecycle-management/state-machine-lib/src/test/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStatesTest.java
+++ b/appc-lifecycle-management/state-machine-lib/src/test/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStatesTest.java
@@ -1,71 +1,71 @@
-/*-
+/*-
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
- * Copyright (C) 2017 Amdocs
- * =============================================================================
- * 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
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *      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.
+ * 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.
  * 
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.appc.statemachine.impl.readers;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.osgi.framework.Bundle;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class AppcOamStatesTest {
-
-    @Test
-    public void testBasicFunctions() {
-        AppcOamStates aState = AppcOamStates.EnteringMaintenanceMode;
-        Assert.assertEquals("name() does not match", "EnteringMaintenanceMode", aState.name());
-        Assert.assertEquals("toString() does not match", "EnteringMaintenanceMode", aState.toString());
-        Assert.assertEquals("osgiBundleState does not match", 0, aState.osgiBundleState);
-    }
-
-    @Test
-    public void testGetOamStateFromBundleState() {
-        Map<Integer, AppcOamStates> resultMap = new HashMap<Integer, AppcOamStates>() {
-            {
-                put(Bundle.UNINSTALLED,     AppcOamStates.NotInstantiated);
-                put(Bundle.INSTALLED,       AppcOamStates.Instantiated);
-                put(Bundle.RESOLVED,        AppcOamStates.Stopped);
-                put(Bundle.STARTING,        AppcOamStates.Starting);
-                put(Bundle.STOPPING,        AppcOamStates.Stopping);
-                put(Bundle.ACTIVE,          AppcOamStates.Started);
-            }
-        };
-        for (Map.Entry<Integer, AppcOamStates> aEntry : resultMap.entrySet()) {
-            Integer bundleState = aEntry.getKey();
-            AppcOamStates oamState = aEntry.getValue();
-            Assert.assertEquals(String.format("OSGI bundle state(%d) shoule associate with oamState(%s)",
-                    bundleState, oamState), oamState, AppcOamStates.getOamStateFromBundleState(bundleState));
-        }
-
-        int bundleState = Bundle.START_TRANSIENT;
-        Assert.assertEquals(String.format("OSGI bundle state(%d) shoule associate with NotInstantiated state.",
-                bundleState), AppcOamStates.NotInstantiated, AppcOamStates.getOamStateFromBundleState(bundleState));
-
-        bundleState = Bundle.STOP_TRANSIENT;
-        Assert.assertEquals(String.format("OSGI bundle state(%d) shoule associate with NotInstantiated state.",
-                bundleState), AppcOamStates.NotInstantiated, AppcOamStates.getOamStateFromBundleState(bundleState));
-    }
-}
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.statemachine.impl.readers;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AppcOamStatesTest {
+
+    @Test
+    public void testBasicFunctions() {
+        AppcOamStates aState = AppcOamStates.EnteringMaintenanceMode;
+        Assert.assertEquals("name() does not match", "EnteringMaintenanceMode", aState.name());
+        Assert.assertEquals("toString() does not match", "EnteringMaintenanceMode", aState.toString());
+        Assert.assertEquals("osgiBundleState does not match", 0, aState.osgiBundleState);
+    }
+
+    @Test
+    public void testGetOamStateFromBundleState() {
+        Map<Integer, AppcOamStates> resultMap = new HashMap<Integer, AppcOamStates>() {
+            {
+                put(Bundle.UNINSTALLED,     AppcOamStates.NotInstantiated);
+                put(Bundle.INSTALLED,       AppcOamStates.Instantiated);
+                put(Bundle.RESOLVED,        AppcOamStates.Stopped);
+                put(Bundle.STARTING,        AppcOamStates.Starting);
+                put(Bundle.STOPPING,        AppcOamStates.Stopping);
+                put(Bundle.ACTIVE,          AppcOamStates.Started);
+            }
+        };
+        for (Map.Entry<Integer, AppcOamStates> aEntry : resultMap.entrySet()) {
+            Integer bundleState = aEntry.getKey();
+            AppcOamStates oamState = aEntry.getValue();
+            Assert.assertEquals(String.format("OSGI bundle state(%d) shoule associate with oamState(%s)",
+                    bundleState, oamState), oamState, AppcOamStates.getOamStateFromBundleState(bundleState));
+        }
+
+        int bundleState = Bundle.START_TRANSIENT;
+        Assert.assertEquals(String.format("OSGI bundle state(%d) shoule associate with NotInstantiated state.",
+                bundleState), AppcOamStates.NotInstantiated, AppcOamStates.getOamStateFromBundleState(bundleState));
+
+        bundleState = Bundle.STOP_TRANSIENT;
+        Assert.assertEquals(String.format("OSGI bundle state(%d) shoule associate with NotInstantiated state.",
+                bundleState), AppcOamStates.NotInstantiated, AppcOamStates.getOamStateFromBundleState(bundleState));
+    }
+}
