diff --git a/core/src/main/java/org/jclouds/chef/internal/BaseChefService.java b/core/src/main/java/org/jclouds/chef/internal/BaseChefService.java
index 40a44a9..1a3b153 100644
--- a/core/src/main/java/org/jclouds/chef/internal/BaseChefService.java
+++ b/core/src/main/java/org/jclouds/chef/internal/BaseChefService.java
@@ -154,7 +154,7 @@
    String buildBootstrapConfiguration(BootstrapConfig bootstrapConfig) {
       checkNotNull(bootstrapConfig, "bootstrapConfig must not be null");
 
-      Map<String, Object> configMap = Maps.newHashMap();
+      Map<String, Object> configMap = Maps.newLinkedHashMap();
       configMap.put("run_list", bootstrapConfig.getRunList());
 
       if (bootstrapConfig.getEnvironment().isPresent()) {
diff --git a/core/src/main/java/org/jclouds/ohai/functions/NestSlashKeys.java b/core/src/main/java/org/jclouds/ohai/functions/NestSlashKeys.java
index c709463..d68ed14 100644
--- a/core/src/main/java/org/jclouds/ohai/functions/NestSlashKeys.java
+++ b/core/src/main/java/org/jclouds/ohai/functions/NestSlashKeys.java
@@ -94,7 +94,7 @@
    @VisibleForTesting
    void mergeAsPeer(String key, JsonBall value, Map<String, JsonBall> insertionContext) {
       Map<String, JsonBall> immutableValueContext = json.fromJson(insertionContext.get(key).toString(), mapLiteral);
-      Map<String, JsonBall> valueContext = Maps.newHashMap(immutableValueContext);
+      Map<String, JsonBall> valueContext = Maps.newLinkedHashMap(immutableValueContext);
       Map<String, JsonBall> toPut = json.<Map<String, JsonBall>> fromJson(value.toString(), mapLiteral);
       Set<String> uniques = Sets.difference(toPut.keySet(), valueContext.keySet());
       for (String k : uniques) {
@@ -135,7 +135,7 @@
 
       checkArgument(rootValue.matches("^\\{.*\\}$"), "value must be a hash: %s", rootValue);
       Map<String, JsonBall> immutableInsertionContext = json.fromJson(rootValue, mapLiteral);
-      Map<String, JsonBall> insertionContext = Maps.newHashMap(immutableInsertionContext);
+      Map<String, JsonBall> insertionContext = Maps.newLinkedHashMap(immutableInsertionContext);
       if (keyParts.size() == 1) {
          if (!insertionContext.containsKey(keyParts.get(0))) {
             insertionContext.put(keyParts.get(0), toInsert);
diff --git a/core/src/test/java/org/jclouds/chef/internal/BaseChefServiceTest.java b/core/src/test/java/org/jclouds/chef/internal/BaseChefServiceTest.java
index e763d8f..d998534 100644
--- a/core/src/test/java/org/jclouds/chef/internal/BaseChefServiceTest.java
+++ b/core/src/test/java/org/jclouds/chef/internal/BaseChefServiceTest.java
@@ -84,7 +84,7 @@
       BootstrapConfig bootstrapConfig = BootstrapConfig.builder().runList(runlist)
             .attributes(new JsonBall("{\"tomcat6\":{\"ssl_port\":8433}}")).build();
       String config = chefService.buildBootstrapConfiguration(bootstrapConfig);
-      assertEquals(config, "{\"tomcat6\":{\"ssl_port\":8433},\"run_list\":[\"recipe[apache2]\",\"role[webserver]\"]}");
+      assertEquals(config, "{\"run_list\":[\"recipe[apache2]\",\"role[webserver]\"],\"tomcat6\":{\"ssl_port\":8433}}");
    }
 
    public void testBuildBootstrapConfigurationWithRunlistAndAttributesAndEnvironment() {
@@ -93,7 +93,7 @@
             .attributes(new JsonBall("{\"tomcat6\":{\"ssl_port\":8433}}")).environment("env").build();
       String config = chefService.buildBootstrapConfiguration(bootstrapConfig);
       assertEquals(config,
-            "{\"tomcat6\":{\"ssl_port\":8433},\"environment\":\"env\",\"run_list\":[\"recipe[apache2]\",\"role[webserver]\"]}");
+            "{\"run_list\":[\"recipe[apache2]\",\"role[webserver]\"],\"environment\":\"env\",\"tomcat6\":{\"ssl_port\":8433}}");
    }
 
 }
diff --git a/core/src/test/java/org/jclouds/ohai/config/OhaiModuleTest.java b/core/src/test/java/org/jclouds/ohai/config/OhaiModuleTest.java
index ecc4562..9f36fe9 100644
--- a/core/src/test/java/org/jclouds/ohai/config/OhaiModuleTest.java
+++ b/core/src/test/java/org/jclouds/ohai/config/OhaiModuleTest.java
@@ -133,7 +133,7 @@
       assertEquals(
             json.toJson(ohai.ohai.get(), new TypeLiteral<Map<String, JsonBall>>() {
             }.getType()),
-            "{\"ohai_time\":1279992919,\"platform\":\"macosx\",\"platform_version\":\"10.3.0\",\"current_user\":\"user\",\"test\":{\"prop2\":\"test2\",\"prop1\":\"test1\"},\"jvm\":{\"system\":{\"user.name\":\"user\",\"os.version\":\"10.3.0\",\"os.name\":\"Mac OS X\"}}}");
+            "{\"ohai_time\":1279992919,\"platform\":\"macosx\",\"platform_version\":\"10.3.0\",\"current_user\":\"user\",\"test\":{\"prop1\":\"test1\",\"prop2\":\"test2\"},\"jvm\":{\"system\":{\"user.name\":\"user\",\"os.version\":\"10.3.0\",\"os.name\":\"Mac OS X\"}}}");
    }
 
    static class Ohai {
diff --git a/core/src/test/java/org/jclouds/ohai/functions/NestSlashKeysTest.java b/core/src/test/java/org/jclouds/ohai/functions/NestSlashKeysTest.java
index 594ab58..f1edb7d 100644
--- a/core/src/test/java/org/jclouds/ohai/functions/NestSlashKeysTest.java
+++ b/core/src/test/java/org/jclouds/ohai/functions/NestSlashKeysTest.java
@@ -31,7 +31,7 @@
 
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
-import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableListMultimap;
 import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -39,7 +39,7 @@
 /**
  * Tests behavior of {@code NestSlashKeys}
  */
-@Test(groups = { "unit" }, sequential = true)
+@Test(groups = "unit", testName = "NestSlashKeysTest")
 public class NestSlashKeysTest {
 
    private NestSlashKeys converter;
@@ -60,56 +60,56 @@
    @Test
    public void testBase() {
       assertEquals(
-            json.toJson(converter.apply(ImmutableMultimap.<String, Supplier<JsonBall>> of("java",
+            json.toJson(converter.apply(ImmutableListMultimap.<String, Supplier<JsonBall>> of("java",
                   Suppliers.ofInstance(new JsonBall("java"))))), "{\"java\":\"java\"}");
    }
 
    @Test(expectedExceptions = IllegalArgumentException.class)
    public void testIllegal() {
-      json.toJson(converter.apply(ImmutableMultimap.<String, Supplier<JsonBall>> of("java",
+      json.toJson(converter.apply(ImmutableListMultimap.<String, Supplier<JsonBall>> of("java",
             Suppliers.ofInstance(new JsonBall("java")), "java/system", Suppliers.ofInstance(new JsonBall("system")))));
    }
 
    @Test
    public void testOne() {
       assertEquals(
-            json.toJson(converter.apply(ImmutableMultimap.<String, Supplier<JsonBall>> of("java",
+            json.toJson(converter.apply(ImmutableListMultimap.<String, Supplier<JsonBall>> of("java",
                   Suppliers.ofInstance(new JsonBall("{\"time\":\"time\"}")), "java/system",
                   Suppliers.ofInstance(new JsonBall("system"))))),
-            "{\"java\":{\"system\":\"system\",\"time\":\"time\"}}");
+            "{\"java\":{\"time\":\"time\",\"system\":\"system\"}}");
    }
 
    @Test
    public void testOneDuplicate() {
       assertEquals(
-            json.toJson(converter.apply(ImmutableMultimap.<String, Supplier<JsonBall>> of("java",
+            json.toJson(converter.apply(ImmutableListMultimap.<String, Supplier<JsonBall>> of("java",
                   Suppliers.ofInstance(new JsonBall("{\"time\":\"time\"}")), "java",
                   Suppliers.ofInstance(new JsonBall("{\"system\":\"system\"}"))))),
-            "{\"java\":{\"system\":\"system\",\"time\":\"time\"}}");
+            "{\"java\":{\"time\":\"time\",\"system\":\"system\"}}");
    }
 
    @Test
    public void testMerge() {
       assertEquals(
-            json.toJson(converter.apply(ImmutableMultimap.<String, Supplier<JsonBall>> of("java",
+            json.toJson(converter.apply(ImmutableListMultimap.<String, Supplier<JsonBall>> of("java",
                   Suppliers.ofInstance(new JsonBall("{\"time\":{\"1\":\"hello\"}}")), "java/time",
                   Suppliers.ofInstance(new JsonBall("{\"2\":\"goodbye\"}"))))),
-            "{\"java\":{\"time\":{\"2\":\"goodbye\",\"1\":\"hello\"}}}");
+            "{\"java\":{\"time\":{\"1\":\"hello\",\"2\":\"goodbye\"}}}");
    }
 
    @Test
    public void testMergeNestedTwice() {
       assertEquals(
-            json.toJson(converter.apply(ImmutableMultimap.<String, Supplier<JsonBall>> of("java",
+            json.toJson(converter.apply(ImmutableListMultimap.<String, Supplier<JsonBall>> of("java",
                   Suppliers.ofInstance(new JsonBall("{\"time\":{\"1\":\"hello\"}}")), "java",
                   Suppliers.ofInstance(new JsonBall("{\"time\":{\"2\":\"goodbye\"}}"))))),
-            "{\"java\":{\"time\":{\"2\":\"goodbye\",\"1\":\"hello\"}}}");
+            "{\"java\":{\"time\":{\"1\":\"hello\",\"2\":\"goodbye\"}}}");
    }
 
    @Test
    public void testReplaceList() {
       assertEquals(
-            json.toJson(converter.apply(ImmutableMultimap.<String, Supplier<JsonBall>> of("java",
+            json.toJson(converter.apply(ImmutableListMultimap.<String, Supplier<JsonBall>> of("java",
                   Suppliers.ofInstance(new JsonBall("{\"time\":{\"1\":[\"hello\"]}}")), "java/time",
                   Suppliers.ofInstance(new JsonBall("{\"1\":[\"goodbye\"]}"))))),
             "{\"java\":{\"time\":{\"1\":[\"goodbye\"]}}}");
