diff --git includes/rules.core.inc includes/rules.core.inc
index a6ca1d2..b70d21d 100644
--- includes/rules.core.inc
+++ includes/rules.core.inc
@@ -1796,39 +1796,48 @@ abstract class RulesContainerPlugin extends RulesPlugin implements IteratorAggre
     return $export;
   }
 
+  /**
+   * Determines whether the element should be exported in flat style. Flat style
+   * means that the export keys are written directly into the export array,
+   * whereas else the export is written into a sub-array.
+   */
+  protected function exportFlat() {
+    // By default we always use flat style for plugins without any parameters
+    // or provided variables, as then only children have to be exported. E.g.
+    // this applies to the OR and AND plugins.
+    return $this->isRoot() || (!$this->pluginParameterInfo() && !$this->providesVariables());
+  }
+
   protected function exportToArray() {
     $export = array();
-    if (isset($this->info['variables'])) {
+    if (!empty($this->info['variables'])) {
       $export['USES VARIABLES'] = $this->info['variables'];
     }
-    if ($settings_export = $this->exportSettings()) {
-      $export[strtoupper($this->plugin())] = $settings_export + $this->exportChildren();
+    if ($this->exportFlat()) {
+      $export += $this->exportSettings() + $this->exportChildren();
     }
     else {
-      $export += $this->exportChildren();
+      $export[strtoupper($this->plugin())] = $this->exportSettings() + $this->exportChildren();
     }
     return $export;
   }
 
   public function import(array $export) {
-    if (isset($export['USES VARIABLES'])) {
+    if (!empty($export['USES VARIABLES'])) {
       $this->info['variables'] = $export['USES VARIABLES'];
     }
-    $key = strtoupper($this->plugin());
-    if (isset($export[$key]) && (isset($export[$key]['USING']) || isset($export[$key]['PROVIDE']))) {
-      $export = $export[$key];
-      $this->importSettings($export);
-      $this->importChildren($export);
-    }
-    else {
-      $this->importChildren($export);
+    // Care for exports having the export array nested in a sub-array.
+    if (!$this->exportFlat()) {
+      $export = reset($export);
     }
+    $this->importSettings($export);
+    $this->importChildren($export);
   }
 
   protected function importChildren($export, $key = NULL) {
     $key = isset($key) ? $key : strtoupper($this->plugin());
     foreach ($export[$key] as $child_export) {
-      $plugin = _rules_import_get_plugin(key($child_export), 'action');
+      $plugin = _rules_import_get_plugin(key($child_export), $this instanceof RulesActionInterface ? 'action' : 'condition');
       $child = rules_plugin_factory($plugin);
       $child->setParent($this);
       $child->import($child_export);
@@ -1896,7 +1905,7 @@ abstract class RulesActionContainer extends RulesContainerPlugin implements Rule
 
   protected function exportToArray() {
     $export = parent::exportToArray();
-    if (isset($this->info['provides'])) {
+    if (!empty($this->info['provides'])) {
       $export['PROVIDES VARIABLES'] = $this->info['provides'];
     }
     return $export;
@@ -1904,7 +1913,7 @@ abstract class RulesActionContainer extends RulesContainerPlugin implements Rule
 
   public function import(array $export) {
     parent::import($export);
-    if (isset($export['PROVIDES VARIABLES'])) {
+    if (!empty($export['PROVIDES VARIABLES'])) {
       $this->info['provides'] = $export['PROVIDES VARIABLES'];
     }
   }
@@ -1956,13 +1965,8 @@ abstract class RulesConditionContainer extends RulesContainerPlugin implements R
   }
 
   protected function exportChildren($key = NULL) {
-    $not = $this->negate ? 'NOT ' : '';
-    $key = isset($key) ? $key : $not . strtoupper($this->plugin());
-    $export[$key] = array();
-    foreach ($this->children as $child) {
-      $export[$key][] = $child->export(TRUE);
-    }
-    return $export;
+    $key = isset($key) ? $key : strtoupper($this->plugin());
+    return parent::exportChildren($this->negate ? 'NOT ' . $key : $key);
   }
 
   protected function importChildren($export, $key = NULL) {
@@ -1972,12 +1976,7 @@ abstract class RulesConditionContainer extends RulesContainerPlugin implements R
       $this->negate = TRUE;
       $key = 'NOT ' . $key;
     }
-    foreach ($export[$key] as $child_export) {
-      $plugin = _rules_import_get_plugin(key($child_export), 'condition');
-      $child = rules_plugin_factory($plugin);
-      $child->setParent($this);
-      $child->import($child_export);
-    }
+    parent::importChildren($export, $key);
   }
 
   /**
diff --git includes/rules.plugins.inc includes/rules.plugins.inc
index daa6475..7518d81 100644
--- includes/rules.plugins.inc
+++ includes/rules.plugins.inc
@@ -259,10 +259,14 @@ class Rule extends RulesActionContainer {
     return $vars;
   }
 
+  protected function exportFlat() {
+    return $this->isRoot();
+  }
+
   protected function exportToArray() {
     $export = parent::exportToArray();
     if (!$this->isRoot()) {
-      $export['LABEL'] = $this->label;
+      $export[strtoupper($this->plugin())]['LABEL'] = $this->label;
     }
     return $export;
   }
@@ -276,8 +280,8 @@ class Rule extends RulesActionContainer {
   }
 
   public function import(array $export) {
-    if (!$this->isRoot() && isset($export['LABEL'])) {
-      $this->label = $export['LABEL'];
+    if (!$this->isRoot() && isset($export[strtoupper($this->plugin())]['LABEL'])) {
+      $this->label = $export[strtoupper($this->plugin())]['LABEL'];
     }
     parent::import($export);
   }
diff --git rules.module rules.module
index 920faab..5a23ded 100644
--- rules.module
+++ rules.module
@@ -480,7 +480,6 @@ function rules_rules_plugin_info() {
           'class' => 'RulesRuleUI',
         ),
       ),
-      'import keys' => array('IF', 'DO'),
     ),
     'loop' => array(
       'class' => 'RulesLoop',
diff --git tests/rules.test tests/rules.test
index 7451613..fd34b66 100644
--- tests/rules.test
+++ tests/rules.test
@@ -607,14 +607,16 @@ class RulesTestCase extends DrupalWebTestCase {
     "REQUIRES" : [ "rules" ],
     "USES VARIABLES" : { "node" : { "label" : "Test node", "type" : "node" } },
     "RULES" : [
-      {
-        "IF" : [ { "NOT data_is" : { "data" : [ "node:title" ], "value" : "test" } } ],
-        "DO" : [ { "data_set" : { "data" : [ "node:title" ], "value" : "test" } } ],
-        "LABEL" : "Test Rule"
+      { "RULE" : {
+          "IF" : [ { "NOT data_is" : { "data" : [ "node:title" ], "value" : "test" } } ],
+          "DO" : [ { "data_set" : { "data" : [ "node:title" ], "value" : "test" } } ],
+          "LABEL" : "Test Rule"
+        }
       },
-      {
-        "DO" : [ { "drupal_message" : { "message" : "hi" } } ],
-        "LABEL" : "Test Rule 2"
+      { "RULE" : {
+          "DO" : [ { "drupal_message" : { "message" : "hi" } } ],
+          "LABEL" : "Test Rule 2"
+        }
       }
     ]
   }
@@ -653,6 +655,17 @@ class RulesTestCase extends DrupalWebTestCase {
 
     $this->assertTrue(!empty($imported_rule) && $imported_rule->integrityCheck(), 'Rule 2 has been imported.');
     $this->assertEqual($export, $imported_rule->export(), 'Export of imported rule 2 equals original export.');
+
+    // Test importing a negated condition component.
+    $export = '{ "rules_negated_component" : {
+    "LABEL" : "negated_component",
+    "PLUGIN" : "or",
+    "REQUIRES" : [ "rules" ],
+    "NOT OR" : [ { "data_is_empty" : { "data" : [ "site:slogan" ] } } ]
+  }
+}';
+    $or = rules_import($export);
+    $this->assertTrue($or->integrityCheck() && $or->isNegated(), 'Negated condition component imported.');
   }
 
   /**
