diff --git a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntity.java b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntity.java
index 4428658..e308a20 100644
--- a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntity.java
+++ b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntity.java
@@ -23,7 +23,6 @@
 import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.entity.cm.salt.impl.SaltEntityImpl;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.annotation.Effector;
 import org.apache.brooklyn.core.annotation.EffectorParam;
diff --git a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntityDriver.java b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntityDriver.java
index 19a88ed..a435991 100644
--- a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntityDriver.java
+++ b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntityDriver.java
@@ -19,7 +19,8 @@
 package org.apache.brooklyn.entity.cm.salt;
 
 import org.apache.brooklyn.entity.software.base.SoftwareProcessDriver;
+import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
 
 public interface SaltEntityDriver extends SoftwareProcessDriver {
-
+    ProcessTaskWrapper<Integer> saltCall(String spec);
 }
diff --git a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltEntityImpl.java b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntityImpl.java
similarity index 79%
rename from software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltEntityImpl.java
rename to software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntityImpl.java
index bea2581..e93ebe7 100644
--- a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltEntityImpl.java
+++ b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntityImpl.java
@@ -7,7 +7,7 @@
  * "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
@@ -16,25 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.brooklyn.entity.cm.salt.impl;
+package org.apache.brooklyn.entity.cm.salt;
 
-import com.google.common.annotations.Beta;
-import org.apache.brooklyn.entity.cm.salt.SaltConfig;
-import org.apache.brooklyn.entity.cm.salt.SaltEntity;
-import org.apache.brooklyn.entity.stock.EffectorStartableImpl;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
+import java.util.Set;
+
+import org.apache.brooklyn.entity.software.base.SoftwareProcessImpl;
 import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Set;
+import com.google.common.annotations.Beta;
 
 @Beta
-public class SaltEntityImpl extends EffectorStartableImpl implements SaltEntity {
+public class SaltEntityImpl extends SoftwareProcessImpl implements SaltEntity {
     private static final Logger LOG = LoggerFactory.getLogger(SaltEntityImpl.class);
 
-    public SaltEntityImpl() {
-        super();
+    @Override
+    public Class getDriverInterface() {
+        return SaltEntityDriver.class;
+    }
+
+    @Override
+    public SaltEntityDriver getDriver() {
+        return (SaltEntityDriver) super.getDriver();
     }
 
     @Override
@@ -60,7 +64,6 @@
 
         SaltConfig.SaltMode mode = getConfig(SaltConfig.SALT_MODE);
         LOG.debug("Initialize SaltStack {} mode", mode.name());
-        new SaltLifecycleEffectorTasks().attachLifecycleEffectors(this);
     }
 
     @Override
@@ -70,8 +73,10 @@
 
     @Override
     public String saltCall(String spec) {
-        final ProcessTaskWrapper<Integer> command = DynamicTasks.queue(SaltSshTasks.saltCall(spec));
+        final ProcessTaskWrapper<Integer> command = getDriver().saltCall(spec);
+
         command.asTask().blockUntilEnded();
+
         if (0 == command.getExitCode()) {
             return command.getStdout();
         } else {
diff --git a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltLifecycleEffectorTasks.java b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntitySshDriver.java
similarity index 68%
rename from software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltLifecycleEffectorTasks.java
rename to software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntitySshDriver.java
index 2051ed6..dac9756 100644
--- a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltLifecycleEffectorTasks.java
+++ b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltEntitySshDriver.java
@@ -7,7 +7,7 @@
  * "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
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.brooklyn.entity.cm.salt.impl;
+package org.apache.brooklyn.entity.cm.salt;
 
 import static java.util.regex.Pattern.DOTALL;
 import static java.util.regex.Pattern.MULTILINE;
@@ -28,8 +28,6 @@
 import java.util.regex.Pattern;
 
 import org.apache.brooklyn.api.effector.Effector;
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.location.MachineLocation;
 import org.apache.brooklyn.api.mgmt.TaskAdaptable;
 import org.apache.brooklyn.camp.brooklyn.BrooklynCampConstants;
 import org.apache.brooklyn.core.effector.Effectors;
@@ -37,10 +35,9 @@
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
 import org.apache.brooklyn.core.entity.trait.Startable;
-import org.apache.brooklyn.entity.cm.salt.SaltConfig;
+import org.apache.brooklyn.entity.software.base.AbstractSoftwareProcessSshDriver;
 import org.apache.brooklyn.entity.software.base.SoftwareProcess;
-import org.apache.brooklyn.entity.software.base.SoftwareProcess.StopSoftwareParameters;
-import org.apache.brooklyn.entity.software.base.lifecycle.MachineLifecycleEffectorTasks;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.task.DynamicTasks;
@@ -51,43 +48,35 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableMap;
 
-@Beta
-public class SaltLifecycleEffectorTasks extends MachineLifecycleEffectorTasks implements SaltConfig {
-    private static final Logger LOG = LoggerFactory.getLogger(SaltLifecycleEffectorTasks.class);
+// TODO: does this belong to the _.impl package?
+public class SaltEntitySshDriver extends AbstractSoftwareProcessSshDriver implements SaltEntityDriver {
+    private static final Logger LOG = LoggerFactory.getLogger(SaltEntitySshDriver.class);
+    private static final Pattern FAILURES = Pattern.compile(".*^Failed:\\s+(\\d+)$.*", MULTILINE | DOTALL);
+    private static final String ZERO = "0";
+
+    public SaltEntitySshDriver(SaltEntityImpl entity, SshMachineLocation machine) {
+        super(entity, machine);
+    }
 
     @Override
-    protected String startProcessesAtMachine(Supplier<MachineLocation> machineS) {
-        SaltMode mode = detectSaltMode(entity());
-        final MachineLocation machine = machineS.get();
-        LOG.info("Starting salt in '{}' mode at '{}'", mode, machine.getDisplayName());
-        if (mode == SaltMode.MASTERLESS) {
-            startWithSshAsync();
-        } else {
+    public void install() {
+        SaltConfig.SaltMode mode = getEntity().config().get(SaltConfig.SALT_MODE);
+        Preconditions.checkNotNull(mode, "Required config " + SaltConfig.SALT_MODE + " not provided for entity: " + entity);
+        LOG.info("Starting salt in '{}' mode at '{}'", mode, getMachine().getDisplayName());
+
+        if (mode != SaltConfig.SaltMode.MASTERLESS) {
             // TODO: implement MASTER and MINION
             throw new IllegalStateException("Unknown salt mode: " + mode.name());
         }
-        return "salt tasks submitted (" + mode + ")";
-    }
 
-
-    protected static SaltMode detectSaltMode(Entity entity) {
-        SaltMode mode = entity.getConfig(SaltConfig.SALT_MODE);
-        Preconditions.checkNotNull(mode, "Required config " + SaltConfig.SALT_MODE + " not provided for entity: " + entity);
-        return mode;
-    }
-
-    protected void startWithSshAsync() {
-
-        final Set<? extends String> startStates = entity().getConfig(SaltConfig.START_STATES);
-        final Set<? extends String> formulas = entity().getConfig(SaltConfig.SALT_FORMULAS);
-        final Set<? extends String> pillars = entity().getConfig(SaltConfig.SALT_PILLARS);
-        final Set<? extends String> pillarUrls = entity().getConfig(SaltConfig.SALT_PILLAR_URLS);
-        final String entityId = entity().getConfig(BrooklynCampConstants.PLAN_ID);
+        final Set<? extends String> startStates = getEntity().config().get(SaltConfig.START_STATES);
+        final Set<? extends String> formulas = getEntity().config().get(SaltConfig.SALT_FORMULAS);
+        final Set<? extends String> pillars = getEntity().config().get(SaltConfig.SALT_PILLARS);
+        final Set<? extends String> pillarUrls = getEntity().config().get(SaltConfig.SALT_PILLAR_URLS);
+        final String entityId = getEntity().config().get(BrooklynCampConstants.PLAN_ID);
 
         final ProcessTaskWrapper<Integer> installedAlready = queueAndBlock(SaltSshTasks.isSaltInstalled(false));
 
@@ -96,10 +85,10 @@
                 @Override
                 public void run() {
                     DynamicTasks.queue(
-                        SaltSshTasks.installSalt(false),
-                        SaltSshTasks.installSaltUtilities(false),
-                        SaltSshTasks.configureForMasterlessOperation(false),
-                        SaltSshTasks.installTopFile(startStates, false));
+                            SaltSshTasks.installSalt(false),
+                            SaltSshTasks.installSaltUtilities(false),
+                            SaltSshTasks.configureForMasterlessOperation(false),
+                            SaltSshTasks.installTopFile(startStates, false));
 
                     if (Strings.isNonBlank(entityId)) {
                         DynamicTasks.queue(SaltSshTasks.setMinionId(entityId));
@@ -109,18 +98,17 @@
                 }
             });
         }
-
-        startSalt();
-
-        connectSensors();
     }
 
+    @Override
+    public void customize() {
+        newScript(CUSTOMIZING).execute();
+    }
 
-    private static final Pattern FAILURES = Pattern.compile(".*^Failed:\\s+(\\d+)$.*", MULTILINE | DOTALL);
-    private static final String ZERO = "0";
-
-    private void startSalt() {
+    @Override
+    public void launch() {
         String name = "apply top states";
+
         final ProcessTaskWrapper<Integer> topStates = queueAndBlock(SaltSshTasks.applyTopStates(false).summary(name));
 
         // Salt apply returns exit code 0 even upon failure so check the stdout.
@@ -128,10 +116,70 @@
         if (!failCount.matches() || !ZERO.equals(failCount.group(1))) {
             LOG.warn("Encountered error in applying Salt top states: {}", topStates.getStdout());
             throw new RuntimeException(
-                "Encountered error in applying Salt top states, see '" + name + "' in activities for details");
+                    "Encountered error in applying Salt top states, see '" + name + "' in activities for details");
         }
     }
 
+    @Override
+    public void runPostLaunchCommand() {
+        super.runPostLaunchCommand();
+
+        final ProcessTaskWrapper<String> retrieveHighstate = SaltSshTasks.retrieveHighstate();
+        final ProcessTaskWrapper<String> highstate = DynamicTasks.queue(retrieveHighstate).block();
+        String stateDescription = highstate.get();
+
+        SaltHighstate.applyHighstate(stateDescription, getEntity());
+
+        getEntity().sensors().set(SoftwareProcess.SERVICE_UP, true);
+    }
+
+    @Override
+    public boolean isRunning() {
+        return true;
+    }
+
+    @Override
+    public void stop() {
+        final Set<? extends String> stopStates = getEntity().config().get(SaltConfig.STOP_STATES);
+        LOG.debug("Executing Salt stopProcessesAtMachine with states {}", stopStates);
+        if (stopStates.isEmpty()) {
+            stopBasedOnStartStates();
+        } else {
+            applyStates(stopStates);
+        }
+    }
+
+    @Override
+    public void restart() {
+        ServiceStateLogic.setExpectedState(getEntity(), Lifecycle.STOPPING);
+
+        try {
+            final Set<? extends String> restartStates = getEntity().config().get(SaltConfig.RESTART_STATES);
+            LOG.debug("Executing Salt restart with states {}", restartStates);
+            if (restartStates.isEmpty()) {
+                restartBasedOnStartStates();
+            } else {
+                applyStates(restartStates);
+            }
+            ServiceStateLogic.setExpectedState(getEntity(), Lifecycle.RUNNING);
+        } catch (Exception e) {
+            getEntity().sensors().set(ServiceStateLogic.SERVICE_NOT_UP_DIAGNOSTICS,
+                    ImmutableMap.<String, Object>of("restart", e.getMessage()));
+            ServiceStateLogic.setExpectedState(getEntity(), Lifecycle.ON_FIRE);
+        }
+    }
+
+    @Override
+    public ProcessTaskWrapper<Integer> saltCall(String spec) {
+        return DynamicTasks.queue(SaltSshTasks.saltCall(spec));
+    }
+
+    private ProcessTaskWrapper<Integer> queueAndBlock(ProcessTaskFactory<Integer> taskFactory) {
+        final ProcessTaskWrapper<Integer> queued = DynamicTasks.queue(taskFactory);
+        queued.asTask().blockUntilEnded();
+        return queued;
+    }
+
     private void installFormulas(Set<? extends String> formulas) {
         if (formulas.size() > 0) {
             DynamicTasks.queue(SaltSshTasks.enableFileRoots(false));
@@ -148,7 +196,7 @@
         if (pillarUrls.size() > 0) {
             final TaskBuilder<Object> pillarTasks = TaskBuilder.builder().displayName("install pillars");
             pillarTasks.add(SaltSshTasks.invokeSaltUtility("init_pillar_config", null, false)
-                .summary("init pillar config").newTask());
+                    .summary("init pillar config").newTask());
             for (String pillar : pillars) {
                 pillarTasks.add(SaltSshTasks.addPillarToTop(pillar, false).newTask());
             }
@@ -159,32 +207,12 @@
         }
     }
 
-    private void connectSensors() {
-        final ProcessTaskWrapper<String> retrieveHighstate = SaltSshTasks.retrieveHighstate();
-        final ProcessTaskWrapper<String> highstate = DynamicTasks.queue(retrieveHighstate).block();
-        String stateDescription = highstate.get();
-
-        SaltHighstate.applyHighstate(stateDescription, entity());
-    }
-
-    @Override
-    protected void postStartCustom() {
-        // TODO: check for package installed?
-        entity().sensors().set(SoftwareProcess.SERVICE_UP, true);
-        super.postStartCustom();
-    }
-
-
-    @Override
-    protected String stopProcessesAtMachine() {
-        final Set<? extends String> stopStates = entity().getConfig(SaltConfig.STOP_STATES);
-        LOG.debug("Executing Salt stopProcessesAtMachine with states {}", stopStates);
-        if (stopStates.isEmpty()) {
-            stopBasedOnStartStates();
-        } else {
-            applyStates(stopStates);
+    private MutableSet<String> addSuffix(Set<? extends String> names, String suffix) {
+        final MutableSet<String> suffixed = MutableSet.of();
+        for (String name : names) {
+            suffixed.add(name + suffix);
         }
-        return null;
+        return suffixed;
     }
 
     private void applyStates(Set<? extends String> states) {
@@ -194,10 +222,10 @@
     }
 
     private void stopBasedOnStartStates() {
-        final Set<? extends String> startStates = entity().getConfig(SaltConfig.START_STATES);
+        final Set<? extends String> startStates = getEntity().config().get(SaltConfig.START_STATES);
         final MutableSet<String> stopStates = addSuffix(startStates, ".stop");
         final ProcessTaskWrapper<Integer> checkStops =
-            queueAndBlock(SaltSshTasks.verifyStates(stopStates, false).summary("check stop states"));
+                queueAndBlock(SaltSshTasks.verifyStates(stopStates, false).summary("check stop states"));
         if (0 != checkStops.getExitCode()) {
             throw new RuntimeException("No stop_states configured and not all start_states have matching stop states");
         } else {
@@ -205,31 +233,11 @@
         }
     }
 
-    @Override
-    public void restart(ConfigBag parameters) {
-        ServiceStateLogic.setExpectedState(entity(), Lifecycle.STOPPING);
-
-        try {
-            final Set<? extends String> restartStates = entity().getConfig(SaltConfig.RESTART_STATES);
-            LOG.debug("Executing Salt restart with states {}", restartStates);
-            if (restartStates.isEmpty()) {
-                restartBasedOnStartStates();
-            } else {
-                applyStates(restartStates);
-            }
-            ServiceStateLogic.setExpectedState(entity(), Lifecycle.RUNNING);
-        } catch (Exception e) {
-            entity().sensors().set(ServiceStateLogic.SERVICE_NOT_UP_DIAGNOSTICS,
-                ImmutableMap.<String, Object>of("restart", e.getMessage()));
-            ServiceStateLogic.setExpectedState(entity(), Lifecycle.ON_FIRE);
-        }
-    }
-
     private void restartBasedOnStartStates() {
-        final Set<? extends String> startStates = entity().getConfig(SaltConfig.START_STATES);
+        final Set<? extends String> startStates = getEntity().config().get(SaltConfig.START_STATES);
         final MutableSet<String> restartStates = addSuffix(startStates, ".restart");
         final ProcessTaskWrapper<Integer> queued =
-            queueAndBlock(SaltSshTasks.findStates(restartStates, false).summary("check restart states"));
+                queueAndBlock(SaltSshTasks.findStates(restartStates, false).summary("check restart states"));
         final String stdout = queued.getStdout();
         String[] foundStates = Strings.isNonBlank(stdout) ? stdout.split("\\n") : null;
 
@@ -248,28 +256,14 @@
             // (and in that effector we'd fail if stop was not well-defined)
             LOG.debug("No stop states available, invoking stop and start effectors");
             invokeEffector(Startable.STOP, ConfigBag.newInstance()
-                .configure(StopSoftwareParameters.STOP_PROCESS_MODE, ALWAYS)
-                .configure(StopSoftwareParameters.STOP_MACHINE_MODE, NEVER));
+                    .configure(SoftwareProcess.StopSoftwareParameters.STOP_PROCESS_MODE, ALWAYS)
+                    .configure(SoftwareProcess.StopSoftwareParameters.STOP_MACHINE_MODE, NEVER));
             invokeEffector(Startable.START, ConfigBag.EMPTY);
         }
     }
 
-    private ProcessTaskWrapper<Integer> queueAndBlock(ProcessTaskFactory<Integer> taskFactory) {
-        final ProcessTaskWrapper<Integer> queued = DynamicTasks.queue(taskFactory);
-        queued.asTask().blockUntilEnded();
-        return queued;
-    }
-
     private void invokeEffector(Effector<Void> effector, ConfigBag config) {
-        final TaskAdaptable<Void> stop = Entities.submit(entity(), Effectors.invocation(entity(), effector, config));
+        final TaskAdaptable<Void> stop = Entities.submit(getEntity(), Effectors.invocation(getEntity(), effector, config));
         stop.asTask().blockUntilEnded();
     }
-
-    private MutableSet<String> addSuffix(Set<? extends String> names, String suffix) {
-        final MutableSet<String> suffixed = MutableSet.of();
-        for (String name : names) {
-            suffixed.add(name + suffix);
-        }
-        return suffixed;
-    }
 }
diff --git a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltHighstate.java b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltHighstate.java
similarity index 97%
rename from software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltHighstate.java
rename to software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltHighstate.java
index fdae93b..16a4224 100644
--- a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltHighstate.java
+++ b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltHighstate.java
@@ -7,7 +7,7 @@
  * "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
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.brooklyn.entity.cm.salt.impl;
+package org.apache.brooklyn.entity.cm.salt;
 
 import com.google.common.reflect.TypeToken;
 
diff --git a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltSshTasks.java b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltSshTasks.java
similarity index 98%
rename from software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltSshTasks.java
rename to software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltSshTasks.java
index a8e1af6..03daf8e 100644
--- a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltSshTasks.java
+++ b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltSshTasks.java
@@ -7,7 +7,7 @@
  * "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
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.brooklyn.entity.cm.salt.impl;
+package org.apache.brooklyn.entity.cm.salt;
 
 import org.apache.brooklyn.api.mgmt.TaskAdaptable;
 import org.apache.brooklyn.api.mgmt.TaskFactory;
diff --git a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltUtils.java b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltUtils.java
similarity index 93%
rename from software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltUtils.java
rename to software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltUtils.java
index b11c06e..fc18a86 100644
--- a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltUtils.java
+++ b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/SaltUtils.java
@@ -7,7 +7,7 @@
  * "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
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.brooklyn.entity.cm.salt.impl;
+package org.apache.brooklyn.entity.cm.salt;
 
 import org.apache.brooklyn.api.location.LocationDefinition;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
diff --git a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltEntitySshDriver.java b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltEntitySshDriver.java
deleted file mode 100644
index 7531c27..0000000
--- a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltEntitySshDriver.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-package org.apache.brooklyn.entity.cm.salt.impl;
-
-import org.apache.brooklyn.entity.cm.salt.SaltEntityDriver;
-import org.apache.brooklyn.entity.software.base.AbstractSoftwareProcessSshDriver;
-import org.apache.brooklyn.location.ssh.SshMachineLocation;
-
-// TODO: does this belong to the _.impl package?
-public class SaltEntitySshDriver extends AbstractSoftwareProcessSshDriver implements SaltEntityDriver {
-
-    public SaltEntitySshDriver(SaltEntityImpl entity, SshMachineLocation machine) {
-        super(entity, machine);
-    }
-
-    @Override
-    public SaltEntityImpl getEntity() {
-        return (SaltEntityImpl) super.getEntity();
-    }
-
-    @Override
-    public void install() {
-    }
-
-    @Override
-    public void customize() {
-    }
-
-    @Override
-    public void launch() {
-    }
-
-    @Override
-    public boolean isRunning() {
-        return true;
-    }
-
-    @Override
-    public void stop() {
-    }
-
-}
diff --git a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltSshDriver.java b/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltSshDriver.java
deleted file mode 100644
index cd9cb38..0000000
--- a/software/cm/salt/src/main/java/org/apache/brooklyn/entity/cm/salt/impl/SaltSshDriver.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-package org.apache.brooklyn.entity.cm.salt.impl;
-
-
-public class SaltSshDriver {
-
-    private SaltSshDriver() {
-        // Utility class
-    }
-
-}
diff --git a/software/cm/salt/src/test/java/org/apache/brooklyn/entity/cm/salt/HighstateTest.java b/software/cm/salt/src/test/java/org/apache/brooklyn/entity/cm/salt/HighstateTest.java
index 50205e0..e5d130a 100644
--- a/software/cm/salt/src/test/java/org/apache/brooklyn/entity/cm/salt/HighstateTest.java
+++ b/software/cm/salt/src/test/java/org/apache/brooklyn/entity/cm/salt/HighstateTest.java
@@ -20,7 +20,6 @@
 
 import com.google.common.collect.ImmutableSet;
 import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.entity.cm.salt.impl.SaltHighstate;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.core.test.entity.TestApplication;
