diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/FlowRuleBatchOperationConversionException.java b/core/net/src/main/java/org/onosproject/net/intent/impl/FlowRuleBatchOperationConversionException.java
deleted file mode 100644
index 8bae2af..0000000
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/FlowRuleBatchOperationConversionException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * 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.
- */
-package org.onosproject.net.intent.impl;
-
-import com.google.common.collect.ImmutableList;
-import org.onosproject.net.flow.FlowRuleBatchOperation;
-import org.onosproject.net.intent.IntentException;
-
-import java.util.List;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-// TODO: Reconsider error handling and intent exception design. Otherwise, write Javadoc.
-public class FlowRuleBatchOperationConversionException extends IntentException {
-
-    private final List<FlowRuleBatchOperation> converted;
-
-    public FlowRuleBatchOperationConversionException(List<FlowRuleBatchOperation> converted, Throwable cause) {
-        super("exception occurred during IntentInstaller.install()", cause);
-        this.converted = ImmutableList.copyOf((checkNotNull(converted)));
-    }
-
-    public List<FlowRuleBatchOperation> converted() {
-        return converted;
-    }
-}
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/InstallCoordinating.java b/core/net/src/main/java/org/onosproject/net/intent/impl/InstallCoordinating.java
index e21b2fa..f259595 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/InstallCoordinating.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/InstallCoordinating.java
@@ -17,6 +17,7 @@
 
 import org.onosproject.net.flow.FlowRuleOperations;
 import org.onosproject.net.intent.IntentData;
+import org.onosproject.net.intent.IntentException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,9 +49,9 @@
         try {
             FlowRuleOperations flowRules = intentManager.coordinate(pending);
             return Optional.of(new Installing(intentManager, pending, flowRules));
-        } catch (FlowRuleBatchOperationConversionException e) {
-            log.warn("Unable to install intent {} due to:", pending.intent().id(), e.getCause());
-            return Optional.of(new InstallingFailed(pending)); //FIXME
+        } catch (IntentException e) {
+            log.warn("Unable to generate a FlowRuleOperations from intent {} due to:", pending.intent().id(), e);
+            return Optional.of(new InstallingFailed(pending));
         }
     }
 }
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/Installing.java b/core/net/src/main/java/org/onosproject/net/intent/impl/Installing.java
index 205345c..122f224 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/Installing.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/Installing.java
@@ -17,6 +17,7 @@
 
 import org.onosproject.net.flow.FlowRuleOperations;
 import org.onosproject.net.intent.IntentData;
+import org.onosproject.net.intent.IntentException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,8 +49,10 @@
         try {
             intentManager.flowRuleService.apply(flowRules); // FIXME we need to provide a context
             return Optional.of(new Installed(pending));
-        } catch (FlowRuleBatchOperationConversionException e) {
-            log.warn("Unable to install intent {} due to:", pending.intent().id(), e.getCause());
+        // What kinds of exceptions are thrown by FlowRuleService.apply()?
+        // Is IntentException a correct exception abstraction?
+        } catch (IntentException e) {
+            log.warn("Unable to install intent {} due to: {}", pending.intent().id(), e);
             return Optional.of(new InstallingFailed(pending));
         }
     }
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java b/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java
index 8fbf252..3603a50 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java
@@ -288,14 +288,10 @@
         List<Intent> installables = pending.installables();
         List<List<FlowRuleBatchOperation>> plans = new ArrayList<>(installables.size());
         for (Intent installable : installables) {
-            try {
-                registerSubclassInstallerIfNeeded(installable);
-                //FIXME need to migrate installers to FlowRuleOperations
-                // FIXME need to aggregate the FlowRuleOperations across installables
-                plans.add(getInstaller(installable).install(installable));
-            } catch (Exception e) { // TODO this should be IntentException
-                throw new FlowRuleBatchOperationConversionException(null/*FIXME*/, e);
-            }
+            registerSubclassInstallerIfNeeded(installable);
+            //FIXME need to migrate installers to FlowRuleOperations
+            // FIXME need to aggregate the FlowRuleOperations across installables
+            plans.add(getInstaller(installable).install(installable));
         }
 
         return merge(plans).build(new FlowRuleOperationsContext() { // FIXME move this out
@@ -325,12 +321,7 @@
         List<Intent> installables = current.installables();
         List<List<FlowRuleBatchOperation>> plans = new ArrayList<>();
         for (Intent installable : installables) {
-            try {
-                plans.add(getInstaller(installable).uninstall(installable));
-            } catch (IntentException e) {
-                log.warn("Unable to uninstall intent {} due to:", current.intent().id(), e);
-                throw new FlowRuleBatchOperationConversionException(null/*FIXME*/, e);
-            }
+            plans.add(getInstaller(installable).uninstall(installable));
         }
 
         return merge(plans).build(new FlowRuleOperationsContext() {
