#include <bits/stdc++.h>
using namespace std;
const int N = 20, M = 1000000;
int n, m, cnt, a[N + 9][N + 9];
void into() {
  scanf("%d%d", &n, &m);
  static char s[N + 9];
  cnt = 0;
  for (int i = 1; i <= n; ++i) {
    scanf("%s", s + 1);
    for (int j = 1; j <= m; ++j) a[i][j] = s[j] == 'X', cnt += s[j] == 'O';
  }
}
int cn, exi[M + 9];
struct side {
  int y, next;
} e[M + 9];
int lin[2][M + 9], cs;
void Ins(int id, int x, int y) {
  e[++cs].y = y;
  e[cs].next = lin[id][x];
  lin[id][x] = cs;
}
void Ins2(int id, int x, int y) {
  Ins(id, x, y);
  Ins(id, y, x);
}
void Get_graph1() {
  cs = 1;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) lin[1][(i - 1) * m + j] = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) {
      if (a[i][j]) continue;
      if (i < n && !a[i + 1][j]) Ins2(1, (i - 1) * m + j, i * m + j);
      if (j < m && !a[i][j + 1]) Ins2(1, (i - 1) * m + j, (i - 1) * m + j + 1);
    }
  cn = cs >> 1;
  for (int i = 1; i <= cn; ++i) exi[i] = 0;
}
int vis[M + 9];
void Dfs_vis(int k) {
  vis[k] = 1;
  for (int i = lin[1][k]; i; i = e[i].next)
    if (!exi[i >> 1] && !vis[e[i].y]) Dfs_vis(e[i].y);
}
bool Check0() {
  int res = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) vis[(i - 1) * m + j] = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) {
      if (a[i][j]) continue;
      if (vis[(i - 1) * m + j]) continue;
      if (++res > 1) return 0;
      Dfs_vis((i - 1) * m + j);
    }
  return res == 1;
}
int deg[M + 9];
bool Check1(int k) {
  if (k == 1) return 1;
  if (deg[k] > 1) return 1;
  int x = (k - 1) / m + 1, y = (k - 1) % m + 1;
  if (a[x][y]) return 1;
  if (x + y & 1) return 1;
  return 0;
}
bool Check1() {
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) deg[(i - 1) * m + j] = 0;
  for (int i = 1; i <= cn; ++i) {
    if (exi[i]) continue;
    ++deg[e[i << 1].y];
    ++deg[e[i << 1 | 1].y];
  }
  for (int i = 1; i <= n * m; ++i)
    if (!Check1(i)) return 0;
  return 1;
}
int dfn[M + 9], low[M + 9], co;
vector<int> d0, d1;
void Tarjan(int k, int id) {
  dfn[k] = low[k] = ++co;
  for (int i = lin[1][k]; i; i = e[i].next) {
    if (exi[i >> 1]) continue;
    if (!(i ^ id ^ 1)) continue;
    if (!dfn[e[i].y]) {
      Tarjan(e[i].y, i);
      low[k] = min(low[k], low[e[i].y]);
      if (low[e[i].y] <= dfn[k]) d0.push_back(i >> 1);
    } else {
      low[k] = min(low[k], dfn[e[i].y]);
      d0.push_back(i >> 1);
    }
  }
}
void Get_d() {
  d0.clear();
  co = 0;
  for (int i = 1; i <= n * m; ++i) dfn[i] = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      if (!a[i][j] && !dfn[(i - 1) * m + j]) Tarjan((i - 1) * m + j, 0);
  d1.clear();
  for (int i = 1; i <= n * m; ++i) deg[i] = 0;
  for (int i = 1; i <= cn; ++i) {
    if (exi[i]) continue;
    ++deg[e[i << 1].y];
    ++deg[e[i << 1 | 1].y];
  }
  int flag = 1;
  for (int i = 1; i <= n * m; ++i)
    if (!Check1(i)) {
      flag = 0;
      break;
    }
  if (flag) {
    for (int i = 1; i <= cn; ++i) {
      if (exi[i]) continue;
      int x = e[i << 1].y, y = e[i << 1 | 1].y;
      --deg[x];
      --deg[y];
      if (Check1(x) && Check1(y)) d1.push_back(i);
      ++deg[x];
      ++deg[y];
    }
  }
}
void Get_graph0() {
  cs = cn << 1 | 1;
  for (int i = 1; i <= cn; ++i) lin[0][i] = 0;
  for (int i = 1; i <= cn; ++i) {
    if (!exi[i]) continue;
    exi[i] = 0;
    Get_d();
    for (int x : d0)
      if (x ^ i) Ins(0, i, x);
    for (int x : d1)
      if (x ^ i) Ins(0, x, i);
    exi[i] = 1;
  }
}
int use[M + 9], tag[M + 9], pre[M + 9];
int q[M + 9], hd, tl;
bool Bfs_dis() {
  Get_d();
  for (int i = 1; i <= cn; ++i) tag[i] = use[i] = pre[i] = 0;
  hd = 1;
  tl = 0;
  for (int x : d0) use[q[++tl] = x] = 1;
  for (int x : d1) {
    if (use[x]) {
      exi[x] = 1;
      return 1;
    }
    tag[x] = 1;
  }
  for (; hd <= tl;) {
    int t = q[hd++];
    for (int i = lin[0][t]; i; i = e[i].next) {
      if (!use[e[i].y]) {
        pre[e[i].y] = t;
        use[e[i].y] = 1;
        q[++tl] = e[i].y;
      }
      if (tag[e[i].y]) {
        exi[e[i].y] ^= 1;
        for (; t; t = pre[t]) exi[t] ^= 1;
        return 1;
      }
    }
  }
  return 0;
}
int ans0;
void Mat_cap() {
  ans0 = 1;
  if (!Check0() || !Check1()) {
    ans0 = 0;
    return;
  }
  for (; 2333;) {
    Get_graph0();
    if (!Bfs_dis()) return;
  }
}
char ans[N * 2 + 9][N * 2 + 9];
void Get_ans() {
  if (!ans0) return;
  for (int i = 1; i <= cn; ++i) cnt -= !exi[i];
  if (cnt < 1) {
    ans0 = 0;
    return;
  }
  for (int i = 1; i < n << 1; ++i)
    for (int j = 1; j < m << 1; ++j) ans[i][j] = ' ';
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      ans[i * 2 - 1][j * 2 - 1] = a[i][j] ? 'X' : 'O';
  for (int i = 1; i <= cn; ++i) {
    if (exi[i]) continue;
    int x = e[i << 1 | 1].y, y, u = e[i << 1].y, v;
    y = (x - 1) % m + 1;
    x = (x - 1) / m + 1;
    v = (u - 1) % m + 1;
    u = (u - 1) / m + 1;
    x == u ? ans[x * 2 - 1][y * 2] = 'O' : ans[x * 2][y * 2 - 1] = 'O';
  }
}
void work() {
  Get_graph1();
  Mat_cap();
  Get_ans();
}
void outo() {
  puts(ans0 ? "YES" : "NO");
  if (!ans0) return;
  for (int i = 1; i < n << 1; ++i) {
    for (int j = 1; j < m << 1; ++j) putchar(ans[i][j]);
    puts("");
  }
}
int main() {
  int T;
  scanf("%d", &T);
  for (; T--;) {
    into();
    work();
    outo();
  }
  return 0;
}
