diff --git a/src/ksp/pc/impls/mg/mg.c b/src/ksp/pc/impls/mg/mg.c
index 68aa78d972d..231272efaf8 100644
--- a/src/ksp/pc/impls/mg/mg.c
+++ b/src/ksp/pc/impls/mg/mg.c
@@ -1125,11 +1125,18 @@ PetscErrorCode PCSetUp_MG(PC pc)
     }
     for (i=0; i<n-1; i++) {
       if (!mglevels[i]->b) {
-        Vec *vec;
-        PetscCall(KSPCreateVecs(mglevels[i]->smoothd,1,&vec,0,NULL));
-        PetscCall(PCMGSetRhs(pc,i,*vec));
-        PetscCall(VecDestroy(vec));
-        PetscCall(PetscFree(vec));
+        Vec      vec;
+        Mat      restrct = mglevels[i+1]->restrct;
+        PetscInt m,n;
+
+        /*
+         Previously this used PetscCall(KSPCreateVecs(mglevels[i]->smoothd,1,&vec,0,NULL)); but the smoothd may not be able to produce a vector
+        */
+        PetscCall(MatGetSize(restrct,&m,&n));
+        if (m > n) PetscCall(MatCreateVecs(mglevels[i+1]->restrct,&vec,NULL));
+        else PetscCall(MatCreateVecs(mglevels[i+1]->restrct,NULL,&vec));
+        PetscCall(PCMGSetRhs(pc,i,vec));
+        PetscCall(VecDestroy(&vec));
       }
       if (!mglevels[i]->r && i) {
         PetscCall(VecDuplicate(mglevels[i]->b,&tvec));
@@ -1156,7 +1163,7 @@ PetscErrorCode PCSetUp_MG(PC pc)
       PetscCall(PetscFree(vec));
     }
     if (doCR) {
-      PetscCall(VecDuplicate(mglevels[n-1]->r, &mglevels[n-1]->crx));
+       PetscCall(VecDuplicate(mglevels[n-1]->r, &mglevels[n-1]->crx));
       PetscCall(VecDuplicate(mglevels[n-1]->r, &mglevels[n-1]->crb));
       PetscCall(VecZeroEntries(mglevels[n-1]->crb));
     }
