diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CopycatTransportConnection.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CopycatTransportConnection.java
index b8596ae..a3a8539 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CopycatTransportConnection.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CopycatTransportConnection.java
@@ -56,6 +56,8 @@
  * Base Copycat Transport connection.
  */
 public class CopycatTransportConnection implements Connection {
+    private static final int MAX_MESSAGE_SIZE = 1024 * 1024;
+
     private final Logger log = LoggerFactory.getLogger(getClass());
     private final long connectionId;
     private final String localSubject;
@@ -97,7 +99,11 @@
                 ((ReferenceCounted<?>) message).release();
             }
 
-            messagingService.sendAsync(endpoint, remoteSubject, baos.toByteArray())
+            byte[] bytes = baos.toByteArray();
+            if (bytes.length > MAX_MESSAGE_SIZE) {
+                throw new IllegalArgumentException(message + " exceeds maximum message size " + MAX_MESSAGE_SIZE);
+            }
+            messagingService.sendAsync(endpoint, remoteSubject, bytes)
                     .whenComplete((r, e) -> {
                         if (e != null) {
                             context.executor().execute(() -> future.completeExceptionally(e));
@@ -122,9 +128,14 @@
             if (message instanceof ReferenceCounted) {
                 ((ReferenceCounted<?>) message).release();
             }
+
+            byte[] bytes = baos.toByteArray();
+            if (bytes.length > MAX_MESSAGE_SIZE) {
+                throw new IllegalArgumentException(message + " exceeds maximum message size " + MAX_MESSAGE_SIZE);
+            }
             messagingService.sendAndReceive(endpoint,
                                             remoteSubject,
-                                            baos.toByteArray(),
+                                            bytes,
                                             context.executor())
                     .whenComplete((response, error) -> handleResponse(response, error, future));
         } catch (SerializationException | IOException e) {
@@ -142,11 +153,11 @@
             CompletableFuture<T> future) {
         if (error != null) {
             Throwable rootCause = Throwables.getRootCause(error);
-            if (rootCause instanceof MessagingException || rootCause instanceof SocketException) {
+            if (rootCause instanceof MessagingException.NoRemoteHandler) {
                 future.completeExceptionally(new TransportException(error));
-                if (rootCause instanceof MessagingException.NoRemoteHandler) {
-                    close(rootCause);
-                }
+                close(rootCause);
+            } else if (rootCause instanceof SocketException) {
+                future.completeExceptionally(new TransportException(error));
             } else {
                 future.completeExceptionally(error);
             }
@@ -211,7 +222,11 @@
                 try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
                     baos.write(error != null ? FAILURE : SUCCESS);
                     context.serializer().writeObject(error != null ? error : result, baos);
-                    return baos.toByteArray();
+                    byte[] bytes = baos.toByteArray();
+                    if (bytes.length > MAX_MESSAGE_SIZE) {
+                        throw new IllegalArgumentException("response exceeds maximum message size " + MAX_MESSAGE_SIZE);
+                    }
+                    return bytes;
                 } catch (IOException e) {
                     Throwables.propagate(e);
                     return null;
@@ -278,7 +293,7 @@
                     Throwable wrappedError = error;
                     if (error != null) {
                         Throwable rootCause = Throwables.getRootCause(error);
-                        if (MessagingException.class.isAssignableFrom(rootCause.getClass())) {
+                        if (rootCause instanceof MessagingException.NoRemoteHandler) {
                             wrappedError = new TransportException(error);
                         }
                         future.completeExceptionally(wrappedError);
