@Override
    public void execute(Runnable command) {
        if (!_shutdown.get()) {
            Object serializeCheck;
            DistributedFuture<?> distFuture = null;
            // If it is wrapped by our future, then we have to make sure to 
            // check the actual callable/runnable given to us for serialization
            if (command instanceof DistributedFuture) {
                distFuture = (DistributedFuture<?>)command;
                serializeCheck = distFuture.getCallable();
                if (serializeCheck instanceof RunnableAdapter) {
                    serializeCheck = ((RunnableAdapter<?>)serializeCheck).task;
                }
            }
            else {
                 serializeCheck = command;
            }
            
            if (serializeCheck instanceof Serializable ||
                    serializeCheck instanceof Streamable) {
                if (distFuture != null) {
                    _execProt.addExecutorListener(distFuture, distFuture);
                    _unfinishedLock.lock();
                    try {
                        _unfinishedFutures.add(distFuture);
                    }
                    finally {
                        _unfinishedLock.unlock();
                    }
                }
                ch.down(new ExecutorEvent(ExecutorEvent.TASK_SUBMIT, command));
            }
            else {
                throw new IllegalArgumentException(
                    "Command was not Serializable or Streamable - "
                            + serializeCheck);
            }
        }
        else {
            throw new RejectedExecutionException();
        }
    }